如何使用 XPathNodeIterator 检索值

How to retrieve values using XPathNodeIterator

我正在尝试使用 XPathNodeIterator select 来自元素的值。但是我无法从我的 XML 文件中获得预期值。

我的XML文件

<?xml version="1.0" encoding="utf-8"?>
<ns0:Entity xmlns:ns0="http://schemas.mycompany.com/1.0">
    <ns0:Data>
        <Address_Id xmlns:ns0="http://schemas.mycompany.com/1.0">7</Address_Id>
        <Customer_Id xmlns:ns0="http://schemas.mycompany.com/1.0">67</Customer_Id>
        <CustomerName xmlns:ns0="http://schemas.mycompany.com/1.0">My Customer 1</CustomerName>
    </ns0:Data>
</ns0:Entity>

我获取值的方法
我创建了两种方法,它们都没有 return 我想要的值。

private static string GetValue_Attempt1(XPathDocument xPathDocument, string xpathExpression)
{
    var xpathNavigator = xPathDocument.CreateNavigator();
    var xpathNodeIterator = xpathNavigator.Select(xpathExpression);
    xpathNodeIterator.MoveNext();
    return xpathNodeIterator.Current.Value;
}

private static string GetValue_Attempt2(XPathDocument xPathDocument, string xpathExpression)
{
    var xpathNavigator = xPathDocument.CreateNavigator();
    var xpathNodeIterator = xpathNavigator.Select(xpathExpression);
    xpathNodeIterator.MoveNext();
    var nodesNavigator = xpathNodeIterator.Current;
    var nodesText = nodesNavigator.SelectDescendants(XPathNodeType.Text, false);
    nodesText.MoveNext();
    return nodesText.Current.Value;
}

我的 XPath

问题
可能我使用的 XPath 不正确。但我也不明白结果。为了了解发生了什么。我想知道:

  1. 有没有更好的方式(方法)获取元素的值?
  2. 我需要使用的 XPath 字符串是什么?
  3. 为什么方法 GetValue_Attempt1 return 是一个连接字符串?
  4. 为什么方法GetValue_Attempt2return只有第一个元素的值?

您的 XPath returns 没有匹配项,因为您没有考虑命名空间。

您的 'Attempt 1' 调用了 MoveNext() 一次,因此 Value returns Data 中的所有串联文本以及您调用的 'Attempt 2' MoveNext() 两次将您置于 Address_Id 元素内。

此外,Select,即使 XPath 有效,也不会实际移动光标。

如果你想获得这个值,你会做这样的事情——注意我在 XPath 中包含了命名空间并使用了 SelectSingleNode:

的结果
var nsm = new XmlNamespaceManager(new NameTable());
nsm.AddNamespace("ns0", "http://schemas.mycompany.com/1.0");

var value = navigator.SelectSingleNode("//ns0:Data/Address_Id", nsm).Value;

但是,您有什么理由在这里使用 XPath 和 XPathDocument 吗?使用更具表现力和(更多)静态类型的 LINQ to XML 会更可取,我认为:

XNamespace ns = "http://schemas.mycompany.com/1.0";

var doc = XDocument.Parse(xml);

var addressId = (int)doc.Descendants(ns + "Data")
    .Elements("Address_Id")
    .Single();

var customerId = (int)doc.Descendants(ns + "Data")
    .Elements("Customer_Id")
    .Single();