Как сохранить результат XPathExpression в отдельный XML со структурой предка? - PullRequest
0 голосов
/ 19 декабря 2008

Я анализирую большой XML-файл с выбором XPathExpression для некоторых узлов, существующих на разных уровнях глубины.

Какой самый простой способ экспортировать выбранные узлы в отдельный файл XML, сохраняя все узлы прямого предка (и их атрибуты)? C # является предпочтительным.

Пример исходного XML:

<a>
  <x>
  <b>
    <c/>
    <z/>
  </b>
  <c/>
</a>
<c/>
<d><e/></d>

Ожидаемый целевой XML для фильтрации узлов "c"

<a>
  <b>
    <c/>
  </b>
  <c/>
</a>
<c/>

РЕДАКТИРОВАТЬ: я использую XPathExpression и XPathNodeIterator, потому что есть дополнительная логика для тестирования, если данный узел должен быть включен в результат XML, одного XPathExpression недостаточно. Поэтому в основном у меня есть массив соответствующих элементов XPathNavigator, которые я хочу сохранить в XML со структурой предка.

Ответы [ 2 ]

2 голосов
/ 19 декабря 2008
string xml = @"<xml>
 <a>
  <x/>
  <b>
    <c/>
    <z/>
  </b>
  <c/>
</a>
<c/>
<d><e/></d></xml>";
    XmlDocument doc = new XmlDocument();
    doc.LoadXml(xml);
    XmlDocument results = new XmlDocument();
    XmlNode root = results.AppendChild(results.CreateElement("xml"));
    foreach (XmlNode node in doc.SelectNodes("/*/*[descendant-or-self::c]"))
    {
        root.AppendChild(results.ImportNode(node, true));
    }
    results.Save("out.xml");
0 голосов
/ 19 декабря 2008

Я использовал решение, основанное на вышеприведенном Марке, с небольшой модификацией: я не использую переключатель «потомок или сам», а для выбранных (и проверенных) узлов, я использую следующий обход:

    private void appendToOut(XmlNode node, XmlNode parameter)
    {
        if (node.ParentNode != null && node.ParentNode.NodeType != XmlNodeType.Document)
        {
            appendToOut(node.ParentNode, node);
        }
        diffRoot.AppendChild(diffDoc.ImportNode(node, node==parameter));
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...