我的Xpath出了什么问题?

时间:2011-06-29 08:43:54

标签: c# .net xml xpath

我有一个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 个答案:

答案 0 :(得分:3)

从代码中删除以下行:

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

这将创建一个包含小写字母的所有标记的XML,并且对原始标记名称正确的XPath将不再起作用。

答案 1 :(得分:0)

如果您至少使用.net 3.5,请提供解决方案和建议。

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

}

请务必加入“使用System.Xml.XPath;”

答案 2 :(得分:0)

尝试从代码中删除此行:

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

我尝试将您的xpath转换为小写并保留此行,但重置root.InnerText似乎会破坏XML文档的结构(逐步调试调试器中的代码会将root.ChildNodes.Count属性从2更改为上述行执行后1)。

答案 3 :(得分:0)

如果您有下一个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()