Что не так с моим Xpath? - PullRequest
       1

Что не так с моим Xpath?

2 голосов
/ 29 июня 2011

У меня есть XML-файл, и я пытаюсь получить список всех определенных узлов, используя c #.

Урезанная версия моего xml:

<file>
    <AnotherNode>
    </AnotherNode> 
    <ROWS> 
        <row> 
            <code>Code1</code> 
            <R>1</R> 
            <G>2</G> 
            <B>3</B> 
        </row> 
        <row> 
            <code>Code2</code> 
            <R>1</R> 
            <G>2</G> 
            <B>3</B> 
        </row>
    </ROWS>
</file>

Тамэто несколько «рядных» узлов, и я хочу получить список всех кодов из этих узлов

Я использую XPath:

/file/ROWS/row/code

с этим кодом:

XmlDocument doc = new XmlDocument();
doc.Load(xml);
XmlNode root = doc.DocumentElement;
XmlNodeList nodeList = root.SelectNodes(xpath here);
foreach (XmlNode code in nodeList)
{
}

но я не возвращаю ни одного узла.

Что я делаю не так?

Спасибо.

Ответы [ 4 ]

3 голосов
/ 29 июня 2011

Удалите следующую строку из вашего кода:

root.InnerText = root.InnerText.ToLower();

Это создаст XML со всеми тегами в нижнем регистре, и ваш XPath, верный для оригинальных имен тегов, больше не будет работать.

0 голосов
/ 29 июня 2011

Ваш запрос работал бы, если бы у вас была следующая XML-структура:

<code>
    <R>1</R> 
    <G>2</G> 
    <B>3</B>
</code>

, где R, G, B - подузлы кода.

Но в вашем случае R, G, Bа также код являются подузлами строки:

<row>
    <code> </code>
    <R>1</R> 
    <G>2</G> 
    <B>3</B>
</row>

Таким образом, запрос file/ROWS/row/*[not(self::code)] соберет все значения R, G, B (все подузлы строки, кроме кода).

И вызов doc.SelectNodes(), а не doc.DocumentElement.SelectNodes()!

0 голосов
/ 29 июня 2011

Попробуйте удалить эту строку из своего кода:

root.InnerText = root.InnerText.ToLower();

Я пытался преобразовать ваш xpath в нижний регистр и оставить эту строку внутри, но сброс root.InnerText, похоже, разрушает структуру документа XML (пошаговое выполнение кода в отладчике изменяет свойство root.ChildNodes.Count с 2 на 1 после вышеуказанная строка выполнена).

0 голосов
/ 29 июня 2011

Решение и предложение, если вы используете хотя бы .net 3.5.

XDocument xdoc = XDocument.Load("XMLFile1.xml");
foreach (XElement element in xdoc.XPathSelectElements("//file/ROWS/row/code"))
{

}

Не забудьте включить «using System.Xml.XPath;»

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