首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用XPathNodeIterator检索值

如何使用XPathNodeIterator检索值
EN

Stack Overflow用户
提问于 2015-09-01 10:03:35
回答 1查看 1.9K关注 0票数 4

我试图使用XPathNodeIterator从元素中选择值。但是,我无法从我的XML文件中获得预期的值。

我的XML文件

代码语言:javascript
复制
<?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>

获取值的方法

我创建了两个方法,它们都不返回我想要的值。

代码语言:javascript
复制
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;
}

My XPath

  • Address_Id
    • XPath://Data/Address_Id/text()
    • Attempt1返回:767My Customer 1。为什么所有的值都是连在一起的??
    • Attempt2返回:7。看上去没问题

  • Customer_Id
    • XPath://Data/Customer_Id/text()
    • Attempt1返回:767My Customer 1。为什么所有的值都是连在一起的??
    • Attempt2返回:7。我为什么要拿到Address_Id??

问题

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

  1. 是否有更好的方法(方法)来获取元素的值?
  2. 我需要使用的XPath字符串是什么?
  3. 为什么方法GetValue_Attempt1 要返回一个串连字符串?
  4. 为什么方法GetValue_Attempt2 只返回第一个元素的值?
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-09-01 16:15:21

您的XPath不返回匹配,因为您没有考虑到名称空间。

您的“尝试1”只调用一次MoveNext(),因此Value返回Data中所有连接的文本,而在“尝试2”中,您调用MoveNext()两次,这将使您位于Address_Id元素中。

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

如果您想得到这个值,您可以这样做--注意,我在XPath中包含了名称空间,并使用了SelectSingleNode的结果

代码语言:javascript
复制
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会更好,我认为:

代码语言:javascript
复制
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();
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32328815

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档