XPathSelectElements returns null

本文关键字:null returns XPathSelectElements | 更新日期: 2023-09-27 18:18:18

加载函数已经在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为空。

My 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>

XPathSelectElements returns null

编辑:您的示例XML 没有在名称空间中具有nss别名的id元素。在这种情况下,它将是<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上的查询方法到XML类型,而不是XPath…我发现它更容易避免愚蠢的语法错误等)

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

我正在看问题提交3小时后,41分钟后,它是(最后)编辑。

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

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

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

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

在加载函数,我得到两个id和和listIds为空。

此语句为假,因为//ID选择了所提供的XML文档中唯一名为ID的元素,因此c#变量id的值是非空的。可能您在编辑XML文档之后没有进行彻底的测试。

很可能原来的ID元素属于某个命名空间。但是现在它在"no namespace"中,并且上面的XPath表达式选择了它。

        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");

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

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

XpathSElectElements是system .xml.linq. xelement,它是linq查询日期。它不能直接输出。获取单个的第一个匹配元素使用XPathSelectElement("//ID");可以使用XPathSelectElements作为

检查出现的次数
var count=xDoc.XPathSelectElements("//ID").count();

您还可以使用特定条件

按顺序查询linq语句

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

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

对于第二个列表,因为没有得到值,所以列表项的XPath不正确