XmlDocument Поиск пространства имен возвращает потомков - PullRequest
0 голосов
/ 12 февраля 2020

Я пытаюсь преобразовать узлы, для которых объявлено пространство имен, вместо префикса. Моим первым достижением было просто использовать xslt для преобразования xml, но я начал смотреть на это с помощью класса XmlDocument и использования метода SelectNodes (). Проблема, которую я вижу, заключается в том, что, когда я пытаюсь выбрать узлы, которые имеют пространство имен, он выбирает этот узел И его дочерние элементы. Я предполагаю, что это потому, что он выбирает узел, который содержит дочерние элементы.

<foo xmlns="some url">
    <child>child</child>
</foo>

XmlDocument xdoc = new XmlDocument();
xdoc.LoadXml(xmlstring);
var query = xdoc.SelectNodes("//*[namespace-uri()='some url']");

переменная запроса вернет <foo> и <child> узлы, поэтому, когда я пропущу через узлы oop и изменим его чтобы использовать префикс, я получаю следующий результат:

<prefix:foo>
   <prefix:child></prefix:child>
</prefix:foo>

Есть ли способ просто вернуть только узел <foo> в этом случае? Лучше ли использовать xslt для его преобразования?

Я не думал, что вы могли бы изменить пространство имен или префикс при использовании XDocument и XElement, поэтому я использовал XmlDocument.

Обновление

Результат id want будет префиксом только на узле, где было объявление. Это верно xml правильно или префикс должен быть на дочерних элементах, чтобы быть действительным?

<prefix:foo>
    <child>child</child>
</prefix:foo>

1 Ответ

0 голосов
/ 12 февраля 2020

В модели данных XDM, используемой XPath и XSLT, нет различия между

<foo xmlns="some url">
    <child>child</child>
</foo>

и

<foo xmlns="some url">
    <child xmlns="some url">child</child>
</foo>

Логически пространство имен присутствует как на узлах элемента, так и на его элементах. упущение ребенка в лексической сериализации рассматривается как удобное сокращение.

Так что да, если вы ищете вещи, имеющие это пространство имен, вы получите оба элемента.

Теперь, каковы ваши требования? Я не уверен, что вы полностью понимаете их сами, потому что желаемый результат, который вы показали, на самом деле не правильно сформирован (префикс пространства имен не объявлен). В вашем входе два элемента находятся в одном пространстве имен; в выводе вы, кажется, хотите, чтобы они находились в разных пространствах имен. Если вы хотите обрабатывать их по-другому, вам придется использовать что-то отличное от пространства имен, чтобы различать их.

Помните, что в XDM значение имеет имя узла, а не пространство имен объявления или префиксы; те просто декоративные. Имя узла является комбинацией его локального имени и URI пространства имен. Вы описали свое требование в виде префиксов, но на самом деле важны пространства имен.

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