У меня есть код, который возвращает InnerXML для XMLNode.
Узел может содержать только текст (с HTML) или XML.
Например:
<XMLNode>
Here is some <strong>HTML</strong>
<XMLNode>
или же
<XMLNode>
<XMLContent>Here is some content</XMLContnet>
</XMLNode>
если я получаю InnerXML для <XmlNode>, теги HTML возвращаются как объекты XML.
Я не могу использовать InnerText, потому что мне нужно получить содержимое XML. Так что все, что мне действительно нужно, это способ избежать экранирования тегов HTML, потому что я могу определить, является это XML или нет, и действовать соответствующим образом.
Думаю, я мог бы использовать HTMLDecode, но будет ли это декодировать все объекты в кодировке XML?
Обновлять: Думаю, я немного болтаю выше, поэтому вот проясненный сценарий:
У меня есть XML-документ, который выглядит так:
<content id = "1">
<data><p>A Test</p></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 вернется
<p>A Test</p>
xn2 вернет <dataitem>A test</dataitem>
Я уже проверяю, является ли то, что возвращается XML (в случае xn2), поэтому все, что мне нужно сделать, это отключить < и т. д. В xn1.
HTMLDecode делает это, но я не уверен, что он сработает для всех. Таким образом, остается вопрос, будет ли HTMLDecode обрабатывать все возможные сущности или есть где-нибудь класс, который сделает это за меня.





почему бы не вставить их как & lt; и & gt; ? вы избегаете смешивания xml и пользовательской разметки с этим ...
Я обновил пример, чтобы исправить неправильный синтаксис. Этот ответ на самом деле не является подходящим ответом на вопрос, но я считаю, что мой пример был плохим.
Ваш вопрос немного сложен для понимания. Вот то, что я не совсем понял:
РЕДАКТИРОВАТЬ
Думаю, я уловил картину, но поправьте меня, если я все еще ошибаюсь. Вы хотите вытащить "<p>A Test</p>" из xn1, но "A test" из xn2.
Таким образом, InnerXml - это вариант для xn1, а InnerText - для xn2.
Тогда сделайте это так - проверьте наличие 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.
Я думаю, что Томалак на правильном пути, но я бы написал код немного иначе:
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.");
}
Этот код делает многие ваши неявные предположения явными, и когда вы сталкиваетесь с данными, которые не в той форме, которую вы ожидаете, он расскажет вам, почему это не удалось.
Это действительный ответ, приведенный в вопросе пример НЕ является действительным XML.