Когда я ищу в XPathNodeIterator.Current.SelectSingleNode, он просто ищет во всем XML-документе

Привет, я повторяю список узлов XML в документе XML с помощью XPathNodeIterator. Во время итерации, если условие совпадает, мне нужно конкретное значение под этим текущим узлом. Вместо этого SelectSingleNode возвращает узел из другого родительского узла ... Позвольте мне привести пример:

XPathNavigator SourceReqNav = // Load this using an xml;
XmlNamespaceManager manager = new XmlNamespaceManager(SourceReqNav.NameTable);
SourceReqNav.MoveToRoot();
XPathNodeIterator nodeIterator = SourceReqNav.Select(parentPath, manager);

while (nodeIterator.MoveNext())
{
 //If condition matches at nodeIterator.Current node, Executing a partial xpath related to   
 //only that current node

XPathNavigator singleNode = nodeIterator.Current.SelectSingleNode(xpath, namespaceManager);

// Here at above line, It should return null as Child node doesn't exist but It 
// searches in whole xml and finding the matching one..even though the XPATH is kind of
// partial and applicable to only that node structure.
}

Образец xml:

<RootNode>
 <Element id=1>
   <Address>
     <Name>      </Name>
     <ZipCode>456</ZipCode>
     <Street> </Street>
   </Address>
 </Element>
 <Element id=2>
 </Element>
 <Element id=3> </Element>
</RootNode>

Скажем, я перебираю все «Element» и пытаюсь найти «Address», где element id = 2. Теперь, во время итерации, допустим, я нахожусь на «Element id = 2». Когда я нашел узел, я скажу, что из текущего узла (nodeIterator.Current) выберите единственный узел с именем «Zip». Для этого я использую xpath как «/ Address / ZipCode» (форматирование здесь может быть неправильным, поскольку это только для примера). В этом случае он должен вернуть мне null, но вместо этого он возвращает ZipCode из "Element id = 1"

Любая помощь будет заметна ..


person Reg    schedule 25.09.2013    source источник
comment
Я бы хотел, чтобы больше людей знали XElement о том, как с ним можно использовать LINQ.   -  person gunr2171    schedule 25.09.2013
comment
Что ж, я использую LINQ to XML. Но это было частью гораздо более настраиваемых усилий фреймворка, где пользователь может просто изменить сопоставление через файлы конфигурации, используя XPATH (расширенный). В любом случае, это не то, что я ищу. Я ценю время, которое вы нашли, чтобы взглянуть.   -  person Reg    schedule 25.09.2013


Ответы (1)


Из-за нехватки времени (для исправления) я выбрал немного более длинный маршрут. Вместо поиска непосредственно в текущем узле я получил SubTree (Type: XmlReader) из текущего узла и, используя его, загрузил XPathDocument. Затем создал из него XPathNavigator. Затем применил к нему тот же частичный XPath.

nodeIterator.Current.SelectSingleNode(xpath, namespaceManager);

Это было изменено на:

XmlReader sourceReader = nodeIterator.Current.ReadSubtree();
XPathDocument doc = new XPathDocument(sourceReader);
XPathNavigator sourceNavigator = doc.CreateNavigator();
sourceNavigator.SelectSingleNode(xpath, namespaceManager);

Я все же хотел бы избежать этого, если у кого-то есть лучший ответ. Надеюсь, это кому-то поможет.

person Reg    schedule 08.10.2013
comment
Я знаю, что это супер-старый, но мне также хотелось бы решение, которое не создает другой объект. - person Spaceman; 26.03.2020