Когда я ищу в 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>

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

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

1 ответ

Из-за нехватки времени (для исправления) я выбрал немного более длинный маршрут. Вместо того, чтобы искать прямо в Current Node, я получил SubTree (Type: XmlReader) от узла Current и, используя его, загрузил 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);

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

Другие вопросы по тегам