Как легко избавиться от XML-сущностей в .NET

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

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
0
2 436
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

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

Это действительный ответ, приведенный в вопросе пример НЕ является действительным XML.

Mitchel Sellers 14.10.2008 19:43

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

Tim Saunders 14.10.2008 20:41

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

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

РЕДАКТИРОВАТЬ

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

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

Другие вопросы по теме