Определите узлы HTML в XDocument для замены и перевода в Json - PullRequest
0 голосов
/ 04 ноября 2018

У меня есть XML, который содержит HTML-теги. Используя XDocument, я могу найти узел и заменить содержимое, чтобы удалить теги HTML. Есть ли способ идентифицировать узел с помощью тега HTML, чтобы такая же замена могла быть сделана на ВСЕХ узлах? Вот пример XML.

<?xml version="1.0" encoding="utf-8"?>
<myFields>
  <Request_Description>
    <html>
            <div>test</div>
        </html>
  </Request_Description>
  <Alternatives>
    <html>
      <div>n/a</div>
    </html>
  </Alternatives>
  <Outcome>
    <html>
      <div>n/a</div>
    </html>
  </Outcome>
</myFields>

А вот как я понял, как заменить HTML для одного узла по имени.

XElement req_desc = newxdoc.Root.Element("Request_Description");
if (req_desc != null)
{
    XElement replacenode = new XElement(req_desc.Name, req_desc.Value);
    req_desc.Parent.Add(replacenode);
    req_desc.Remove();
}

Я мог бы сделать то же самое для "Альтернатив" и "Результатов". Но каждый из этих узлов должен быть идентифицирован тем, что их следующий дочерний элемент имеет локальное имя «html». Как я могу найти те элементы, чей первый дочерний элемент имеет локальное имя "html", а затем выполнить шаги замены, которые я делаю выше, чтобы удалить этот HTML-код?

1 Ответ

0 голосов
/ 04 ноября 2018

Вы можете использовать Descendants метод XDocument, чтобы найти все элементы XML в документе, первый дочерний элемент которого имеет локальное имя "html" следующим образом:

var query = from e in newxdoc.Descendants()
            //find those elements whose first child has the local name of "html"
            let child = e.Elements().FirstOrDefault()               
            where child != null && child.Name.LocalName == "html"
            select e;

foreach (var element in query.ToList())
{
    // Remove html and replace with plain text.
    var replacenode = new XElement(element.Name, element.Value);
    element.ReplaceWith(replacenode);
}

Образец скрипки здесь .

...