2008-10-14 81 views
2

我有一些返回XMLNode的InnerXML的代碼。如何在.NET中輕鬆地轉義XML實體

該節點只能包含一些文本(使用HTML)或XML。

例如:

<XMLNode> 
    Here is some &lt;strong&gt;HTML&lt;/strong&gt; 
<XMLNode> 

<XMLNode> 
    <XMLContent>Here is some content</XMLContnet> 
</XMLNode> 

,如果我得到的HTML標籤返回的XML實體<XmlNode>的InnerXML。

我不能使用InnerText,因爲我需要能夠獲取XML內容。所以我真正需要的是一種避免HTML標籤的方式,因爲我可以檢測它是否是XML,並據此採取行動。

我想我可以使用HTMLDecode,但會解碼所有的XML編碼實體嗎?

更新:我想我漫無邊際的上方,這裏有一位是澄清的情景:

我有一個看起來像這樣的XML文檔:

<content id="1"> 
    <data>&lt;p&gt;A Test&lt;/p&gt;</data> 
</content id="2"> 
<content> 
    <data> 
     <dataitem>A test</dataitem> 
    </data> 
</content> 

如果我這樣做:

XmlNode xn1 = document.SelectSingleNode("/content[@id=1]/data"); 
XmlNode xn2 = document.SelectSingleNode("/content[@id=2]/data"); 

Console.WriteLine(xn1.InnerXml); 
Console.WriteLine(xn2.InnerXml);  

XN1將返回

&lt;p&gt;A Test&lt;/p&gt; 

XN2將返回<dataitem>A test</dataitem>

我已經檢查,看看是否有什麼返回是一個XML(在XN2的情況下),所以我需要做的是未逃脫&lt;等在XN1。

HTMLDecode這樣做,但我不知道它會適用於一切。所以問題仍然是HTMLDecode處理所有可能的實體,或者是否有一個類可以爲我做。

回答

1

我覺得託默勒格是在正確的軌道上,但我會寫代碼的方式有點不同:

 XmlNode xn = document.SelectSingleNode("/content[@id=1]/data"); 
     if (xn.ChildNodes.Count != 1) 
     { 
      throw new InvalidOperationException("I don't know what to do if there's not exactly one child node."); 
     } 
     XmlNode child = xn.ChildNodes[0]; 
     switch (child.NodeType) 
     { 
      case XmlNodeType.Element: 
       Console.WriteLine(xn.InnerXml); 
       break; 
      case XmlNodeType.Text: 
       Console.WriteLine(xn.Value); 
       break; 
      default: 
       throw new InvalidOperationException("I can only handle elements and text nodes."); 
     } 

該代碼使得你的隱含假設明確了很多,當你遇到數據,這不是在你期待的形式,它會告訴你爲什麼失敗。

2

爲什麼不插入它們作爲& lt;和& gt; ?你避免混合XML和自定義標記的東西與此...

+0

這是一個有效的響應,問題中提供的示例是無效的XML – 2008-10-14 15:43:17

2

您的問題有點難以遵循。這裏是我沒有完全理解的東西:

  1. 如果您使用的是XmlNode/XmlElement對象,那麼您使用的是XML而不是HTML。所以你可以擁有的只是XML元素。這些可能有HTML元素名稱,但它們 XML。
  2. InnerXml返回一個字符串,至少對於XmlElement對象。你在做什麼?
  3. 你期望什麼樣的數據離開操作?你能舉一個你需要什麼的例子嗎?
  4. 當你有數據時,你打算如何處理數據?也許有一個更好的方式來實現你的目標比想象的更好?

編輯

我覺得我得到的圖片,但糾正我,如果我仍然是錯誤的。您想從xn1中摘取"<p>A Test</p>",但"A test"出於xn2

所以InnerXml是去xn1InnerTextxn2正確的方式。

那麼就這樣做 - 測試dataitem是否存在,並決定當你知道該怎麼做。

XmlNode xn = document.SelectSingleNode("/content[@id=1]/data"); 

if (xn.SelectSingleNode("dataitem") == null) 
    Console.WriteLine(xn.InnerXml); 
else 
    Console.WriteLine(xn.InnerText); 

要回答你關於HttpUtility.HtmlDecode的問題,我只是看着實現,它看起來像它會「工作的一切」,但它似乎是多餘的給我,如果你正在尋找串出來的InnerXml

相關問題