C# 什么';我的Xpath有什么问题?

C# 什么';我的Xpath有什么问题?,c#,.net,xml,xpath,C#,.net,Xml,Xpath,我有一个xml文件,我正在尝试使用c#获取所有特定节点的列表 我的xml的精简版本是: <file> <AnotherNode> </AnotherNode> <ROWS> <row> <code>Code1</code> <R>1</R> <G>2<

我有一个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)
{
}
但我不返回任何节点

我做错了什么


谢谢。

从代码中删除以下行:

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

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

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

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

}

请确保包含“using System.Xml.XPath;”

尝试从代码中删除这一行:

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

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

如果您有下一个XML结构,您的查询将正常工作:

<code>
    <R>1</R> 
    <G>2</G> 
    <B>3</B>
</code>
所以查询
file/ROWS/row/*[not(self::code)]
将收集所有R、G、B值(行的所有子节点,代码除外)


并调用
doc.SelectNodes()
,而不是
doc.DocumentElement.SelectNodes()

请显示一个简短但完整的程序和显示问题的XML文件。XPath问题通常是由名称空间问题引起的,我们可能在“精简”版本中看不到这些问题。XPath表达式表示,
是文档元素。实际上是这样吗?您的
xpath
对我来说很好。因此,我建议这是你的C#,但我不能帮你。@Jon Skeet,我的xml上没有名称空间,我程序的唯一其他部分是将我的xml作为流传递给包含上述内容的函数code@Frederic是的,文件是文档元素oops,这不是问题所在,我尝试使用小写xpath(仍然不起作用)Edited@Bex当前位置这正是为什么一个简短但完整的程序很有用的原因。这意味着每个人都在处理相同的代码,删除了一些愚蠢的琐事。