Как я могу легко избежать XML-сущностей в .NET - PullRequest
2 голосов
/ 14 октября 2008

У меня есть код, который возвращает InnerXML для XMLNode.

Узел может содержать только некоторый текст (с HTML) или XML.

Например:

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

или

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

если я получу InnerXML для <XmlNode>, теги HTML будут возвращены как объекты XML.

Я не могу использовать 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 обрабатывать все возможные объекты или есть класс где-нибудь, что сделает это за меня.

Ответы [ 3 ]

2 голосов
/ 14 октября 2008

Ваш вопрос немного сложен для понимания. Вот вещи, которые я не до конца понял:

  1. Если вы используете объекты XmlNode / XmlElement, вы работаете с XML, а не с HTML. Таким образом, все, что вы можете иметь, это элементы XML. Они могут иметь имена элементов HTML, но они являются XML.
  2. InnerXml возвращает строку, по крайней мере, для объекта XmlElement. С чем ты работаешь?
  3. Какие данные вы ожидаете получить от операции? Можете привести пример того, что вам нужно?
  4. Что именно вы собираетесь делать с данными, когда они у вас есть? Может быть, есть лучший путь к вашей цели, чем то, что вы имеете в виду?

EDIT

Думаю, я понял, но поправьте меня, если я все еще не прав. Вы хотите вырвать "<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 .

2 голосов
/ 14 октября 2008

почему бы не вставить их как & lt; и & gt; ? вы избегаете смешивать xml и пользовательскую разметку с этим ...

1 голос
/ 15 октября 2008

Я думаю, что Томалак на правильном пути, но я бы написал код немного по-другому:

        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.");
        }

Этот код делает многие ваши неявные предположения явными, и когда вы встречаете данные, которые не находятся в ожидаемой вами форме, они сообщают вам, почему они не удалось.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...