2012-07-30 89 views
1

我有一個XML文檔。例如:Linq to XML XElement解析未知命名空間

<Root xmlns:x="anynamespace" xmlns:html="htmlnamespace"> 
    <x:Data>bla bla</x:Data> 
</Root> 

這裏我得到了html命名空間來格式化數據。元素的BUT值可以是例如
<html:Font ...>bla bla</html:Font>
bla <html:Font ...>bla</htmk:Font>

在我的C#代碼我這樣做:
new XElement(main + "Data",myvalue); //main is namespace
結果我得到了<x:Data>&lt;html:Font ...&gt;bla bla etc. Linq的替代關鍵變量與他們的文本代碼。所以這是不可接受的。

然後我試過這個:new XElement(main + "Data",XElement.Parse(myvalue));
在那裏我得到了前綴html無法識別的異常。

有沒有人遇到過這樣的問題?你是如何解決這個問題的?

+0

是你的關於命名空間或關於encodin的問題g HTML? – 2012-07-30 06:32:12

+0

@亨克Holterman,我的問題是...我想在我的sql表格中的某些字段有HTML格式。但它可能是,也可能不是,所以我想做一個「xml注入」。 – StNickolas 2012-07-30 06:57:20

+0

對。 'XElement.Parse()'不會從連接的XDoc _before_中獲取命名空間。 – 2012-07-30 07:10:22

回答

0

通常,您不會構造字符串中的內容,而只是使用LINQ to XML構造節點,例如

  XElement foo = XElement.Parse(@"<foo xmlns=""http://example.com/ns1"" xmlns:html=""http://example.com/html""> 
    <bar>bar 1</bar> 
</foo>"); 
      foo.Add(new XElement(foo.GetNamespaceOfPrefix("html") + "p", "Test")); 

      Console.WriteLine(foo); 

創建XML

<foo xmlns="http://example.com/ns1" xmlns:html="http://example.com/html"> 
    <bar>bar 1</bar> 
    <html:p>Test</html:p> 
</foo> 

如果你想分析給出一個字符串片段,那麼也許下面的方法可以幫助:

 public static void AddWithContext(this XElement element, string fragment) 
     { 
      XmlNameTable nt = new NameTable(); 
      XmlNamespaceManager mgr = new XmlNamespaceManager(nt); 

      IDictionary<string, string> inScopeNamespaces = element.CreateNavigator().GetNamespacesInScope(XmlNamespaceScope.ExcludeXml); 

      foreach (string prefix in inScopeNamespaces.Keys) 
      { 
       mgr.AddNamespace(prefix, inScopeNamespaces[prefix]); 
      } 

      using (XmlWriter xw = element.CreateWriter()) 
      { 
       using (StringReader sr = new StringReader(fragment)) 
       { 
        using (XmlReader xr = XmlReader.Create(sr, new XmlReaderSettings() { ConformanceLevel = ConformanceLevel.Fragment }, new XmlParserContext(nt, mgr, xw.XmlLang, xw.XmlSpace))) 
        { 
         xw.WriteNode(xr, false); 
        } 
       } 
       xw.Close(); 
      } 
     } 
    } 

    class Program 
    { 
     static void Main() 
     { 
      XElement foo = XElement.Parse(@"<foo xmlns=""http://example.com/ns1"" xmlns:html=""http://example.com/html""> 
    <bar>bar 1</bar> 
</foo>"); 
      foo.Add(new XElement(foo.GetNamespaceOfPrefix("html") + "p", "Test")); 

      Console.WriteLine(foo); 
      Console.WriteLine(); 

      foo.AddWithContext("<html:p>Test 2.</html:p><bar>bar 2</bar><html:b>Test 3.</html:b>"); 

      foo.Save(Console.Out, SaveOptions.OmitDuplicateNamespaces); 

     } 

這樣,我得到

<foo xmlns="http://example.com/ns1" xmlns:html="http://example.com/html"> 
    <bar>bar 1</bar> 
    <html:p>Test</html:p> 
    <html:p>Test 2.</html:p> 
    <bar>bar 2</bar> 
    <html:b>Test 3.</html:b> 
</foo> 
+0

嗯..感謝,有幫助。) – StNickolas 2012-07-31 02:30:23