Сохранить определенные узлы при использовании LINQ to XML - PullRequest
3 голосов
/ 28 октября 2010

У меня проблемы с сохранением определенных узлов (в данном случае <b>) при синтаксическом анализе XML с LINQ to XML.Сначала я получаю узел со следующим запросом LINQ ...

IEnumerable<XElement> node = from el in _theData.Descendants("msDict") select el;

, который возвращает следующий XML (как первый XElement) ...

<msDict lexid="m_en_us0000002.001" type="core">
  <df>(preceding a numeral) <b>pound</b> or <b>pounds</b> (of money)
  <genpunc tag="df">.</genpunc></df>
</msDict>

Затем я собираю содержимое с помощью следующего кода ...

StringBuilder output = new StringBuilder();
foreach (XElement elem in node)
{
    output.append(elem.Value);
}

Вот переломный момент.Все узлы XML удалены, но я хочу сохранить все экземпляры <b>.Я ожидаю получить следующее в качестве вывода ...

(preceding a numeral) <b>pound</b> or <b>pounds</b> (of money).

Примечание: я знаю, что это простая операция в XSLT, но я хотел бы знать, есть ли простаяспособ сделать это с помощью LINQ to XML.

1 Ответ

3 голосов
/ 28 октября 2010

В категории «это работает, но это грязно, и я не могу поверить, что я должен прибегнуть к этому»:

StringBuilder output = new StringBuilder();  
foreach (XElement elem in node)  
{  
    output.append(string.Join("", elem.Nodes().Select(n => n.ToString()).ToArray()));  
} 

Лично я думаю, что это требует метода расширения в XElement ...

UPDATE: Если вы хотите исключить все теги элементов , за исключением , то вам нужно использовать рекурсивный метод для возврата значений узлов.

Вот ваше основное тело метода:

StringBuilder output = new StringBuilder();
foreach (XElement elem in node)
{
    output.Append(stripTags(elem));
}

А вот стрип-теги:

private static string stripTags(XNode node)
{
    if (node is XElement && !((XElement)node).Name.ToString().Equals("b", StringComparison.InvariantCultureIgnoreCase))
    {
        return string.Join(string.Empty, ((XElement)node).Nodes().Select(n => stripTags(n)).ToArray());
    }
    else
    {
        return node.ToString();
    }
}

Таким образом, реальный ответ таков: нет, не существует простого способа сделать это с помощью LINQ to XML, но есть способ a ...

...