2009-09-25 5 views
1

Я хочу, чтобы найти простой элемент (Name) в XML:C# Xpath запрос, чтобы найти единый узел

<ZoneContentMapping> 
<ZoneContent> 
    <ContentId>72503</ContentId> 
    <StorefrontZoneId>Name</StorefrontZoneId> 
    <Type>ContentZone</Type> 
</ZoneContent> 
</ZoneContentMapping> 

Я делаю:

XmlNodeList objNode = 
objXML.SelectNodes("ZoneContentMapping/ZoneContent[ContentId='72503']/StorefrontZoneId"); 

мой счетчик узлов всегда равен нулю, где я иду не так?

+1

Вы можете показать код, который инициализирует objXML? – mjv

+0

Что такое 'objXML' в вашем примере кода? Пожалуйста, покажите его тип, а также, как вы загружаете в него вышеприведенный образец XML. –

+0

I XmlDocument.LoadXml() 'этот фрагмент, запускаемый SelectNodes XPath, и я получил единственный узел, который вы искали. Является ли это частью более крупного документа или чего-то еще? – 48klocs

ответ

3

ли занимаемые пространства имен? У меня была аналогичная проблема, анализирующая результаты Amazon AWS, которая оказалась в том, что я не предоставлял XmlNamespaceManager с указанным пространством имен AWS.

XmlNamespaceManager mgr = new XmlNamespaceManager(m_xml.NameTable); 
mgr.AddNamespace("amzn", "http://s3.amazonaws.com/doc/2006-03-01/"); 

XmlNodeList nodes = xmlDoc.SelectNodes("//amzn:Contents", mgr); 

Префикс пространства имен является произвольным, но, как представляется, необходимо в XPath, даже если нет префикса пространства имен не используется в самом XML. Я не мог найти способ сообщить ему связать пустой префикс пространства имен с указанным URL-адресом пространства имен.

0

XPath выглядит хорошо, также как и XML. Пробовал это в XmlSpy, и я получил «Name», чтобы он работал. Тем не менее, попробуйте добавить дополнительный слэш в начале только в случае ...

XmlNodeList objNode = objXML.SelectNodes ("/ZoneContentMapping/ZoneContent[ContentId='72503']/StorefrontZoneId"); 

Или попробуйте SelectSingleNode вместо ...

-1

Вот еще один способ вы могли бы это сделать, если вы хотите:

 string XmlFilePath = @"C:\blablabla"; 

     XmlDocument LoadXmlDoc = new XmlDocument(); 
     LoadXmlDoc.Load(XmlFilePath); 

     XmlNodeList YourNodeList = LoadXmlDoc.GetElementsByTagName("StorefrontZoneId"); 

     LoadXmlDoc.Save(XmlFilePath); 
0

Я думаю, что проблема здесь является контекст, в котором вы выполняете запрос. Если вы загружаете документ в движок XPath, который я использую здесь, корневой контекст является единственным предоставленным узлом, ZoneContentMapping. Помните, что ваш запрос:

ZoneContentMapping/...

Заменяется:

child::ZoneContentMapping/...

По оси по умолчанию в XPath является child. Таким образом, ваш запрос, вероятно, ищет дочерний элемент ZoneContentMapping под названием ZoneContentMapping. К сожалению.

Try:

self::ZoneContentMapping/ZoneContent[ContentId='72503']/StorefrontZoneId

Вы также можете предварять / на запрос, который делает поиск от корня документа XML, независимо от текущего контекста.

+0

В нормальных условиях контекст по умолчанию является _document node_ документа, который станет root ('/') в XPath, а не корневым узлом. –

0

Это работает XPath:

ZoneContentMapping/ZoneContent/StorefrontZoneId [предшествующее-родственный :: ContentID = '72503']

и вот хороший ресурс:

http://www.codeguru.com/csharp/csharp/cs_misc/designtechniques/print.php/c7589__1/

+1

И ваш XPath семантически отличается от его как? Подсказка: «неработающий» XPath в вопросе никоим образом не предполагает, что «StorefrontZoneId был ребенком ContentId». –

+0

Это совсем другое! Кроме того, я использовал свой xml и применил к нему xpath и получил значение «name», как было запрошено. Единственное, что я делал иначе, это использовать XmlNode как тип вместо XmlNodeList – ScottE

Смежные вопросы