XPathSelectElements返回null

时间:2011-12-20 10:38:08

标签: c# xml xpath xmldocument

已在xmlData类中定义了加载函数

public class XmlData
{
    public void Load(XElement xDoc)
    {
        var id = xDoc.XPathSelectElements("//ID");
        var listIds = xDoc.XPathSelectElements("/Lists//List/ListIDS/ListIDS");
    }
}

我只是从我的角度调用Load函数。

            XmlData aXmlData = new XmlData();

            string input, stringXML = "";
            TextReader aTextReader = new StreamReader("D:\\test.xml");
            while ((input = aTextReader.ReadLine()) != null)
            {
                stringXML += input;
            }
            XElement Content = XElement.Parse(stringXML);
            aXmlData.Load(Content);

在加载函数中,即时获取id和listIds为null。

我的test.xml包含

<SEARCH>
  <ID>11242</ID>
  <Lists>
    <List CURRENT="true" AGGREGATEDCHANGED="false">
      <ListIDS>
        <ListID>100567</ListID>
        <ListID>100564</ListID>
        <ListID>100025</ListID>
        <ListID>2</ListID>
        <ListID>1</ListID>
      </ListIDS>
    </List>
  </Lists>
</SEARCH>

4 个答案:

答案 0 :(得分:6)

编辑:您的示例XML 在名称空间中具有id元素并带有nss别名。在这种情况下,它将是<nss:id>,或者设置默认命名空间。我已经假设这个答案实际上你要在命名空间中找到的元素是

您的查询正在尝试在根级别查找名为id的元素。要查找所有 id元素,您需要:

var tempId = xDoc.XPathSelectElements("//nss:id", ns);

......虽然我亲自使用:

XDocument doc = XDocument.Parse(...);
XNamespace nss = "http://schemas.microsoft.com/SQLServer/reporting/reportdesigner";
// Or use FirstOrDefault(), or whatever...
XElement idElement = doc.Descendants(nss + "id").Single();

(我更喜欢使用LINQ to XML类型的查询方法而不是XPath ...我发现更容易避免愚蠢的语法错误等。)

您的示例代码也不清楚,因为您正在使用尚未声明的xDoc ...它有助于编写完整的示例,理想情况下包括编译和运行所需的所有内容作为控制台应用程序。

答案 1 :(得分:1)

我在提交问题3小时后查看问题,并在编辑完(最后)编辑后41分钟。

提供的XML文档中没有定义名称空间。

    var listIds = xDoc.XPathSelectElements("/Lists//List/ListIDS/ListIDS");

此XPath表达式显然不会从提供的XML文档中选择任何节点,因为XML文档没有名为Lists的顶级元素(实际顶部元素的名称为SEARCH

var id = xDoc.XPathSelectElements("//ID");
     

在加载函数中,即时获取id和listIds为null。

此语句为false,因为//ID在提供的XML文档中选择唯一名为ID的元素,因此C#变量id的值为非null。可能在编辑XML文档后没有彻底测试。

最有可能原始的ID元素属于某个命名空间。但现在它处于“无命名空间”,上面的XPath表达式确实选择了它。

答案 2 :(得分:0)

        string xmldocument = "<response xmlns:nss=\"http://schemas.microsoft.com/SQLServer/reporting/reportdesigner\"><action>test</action><id>1</id></response>";

        XElement Content = XElement.Parse(xmldocument);
        XPathNavigator navigator = Content.CreateNavigator();
        XmlNamespaceManager ns = new XmlNamespaceManager(navigator.NameTable);
        ns.AddNamespace("nss", "http://schemas.microsoft.com/SQLServer/reporting/reportdesigner");
        var tempId = navigator.SelectSingleNode("/id");

答案 3 :(得分:0)

null值或系统返回值的原因是由于以下

 var id = xDoc.XPathSelectElements("//ID");

XpathSElectElements是System.xml.linq.XElment,它是linq查询日期。它不能直接输出。 获取个人第一匹配元素 使用XPathSelectElement(“// ID”); 您可以使用XPathSelectElements检查出现次数为

var count=xDoc.XPathSelectElements("//ID").count();

您还可以使用特定条件

将linq语句作为订单查询

为了从列表中获取节点值,您可以使用此

foreach (XmlNode xNode in xDoc.SelectNodes("//ListIDS/ListID"))
{
Console.WriteLine(xNode.InnerText);
}

对于第二个列表,您自己获得了值,列表项的XPath不正确