将 xpath 与 c# 一起使用,帮助

本文关键字:帮助 一起 xpath | 更新日期: 2023-09-27 17:56:34

我正在尝试选择以下XML MINRANGE的内容。这是我正在使用的代码,字符串min只是给了我一长串文本,而不是我想要的节点。

XPathDocument _BTCall = new XPathDocument(callUrl);
XPathNavigator nav = _BTCall.CreateNavigator();
XPathExpression exp;
exp = nav.Compile("//MAX/MINRANGE");
XPathNodeIterator iterator = nav.Select(exp);
iterator.MoveNext();
XPathNavigator nav2 = iterator.Current.Clone();
string min = nav.Value;
return int.Parse(min);

<ADSL_CHECKER>
  <ERRORID>0</ERRORID>
  <INPUT>01491410786</INPUT>
  <INPUTTYPE>TELNO</INPUTTYPE>
  <FIXEDRATE>
    <RAG>G</RAG>
    <READYDATE />
    <EXCHSTATE>E</EXCHSTATE>
    <CAPACITY />
  </FIXEDRATE>
  <RATEADAPTIVE>
    <RAG>G</RAG>
    <READYDATE />
    <EXCHSTATE>E</EXCHSTATE>
    <CAPACITY />
  </RATEADAPTIVE>
  <MAX>
    <RAG>G</RAG>
    <SPEED>4500</SPEED>
    <MINRANGE>3500</MINRANGE>
    <MAXRANGE>5500</MAXRANGE>
    <READYDATE />
    <EXCHSTATE>E</EXCHSTATE>
    <CAPACITY />
  </MAX>
  <WBC>
    <RAG>G</RAG>
    <SPEED>5500</SPEED>
    <MINRANGE>4500</MINRANGE>
    <MAXRANGE>6500</MAXRANGE>
    <READYDATE />
    <EXCHSTATE>E</EXCHSTATE>
    <CAPACITY />
  </WBC>
  <WBCFTTC>
    <RAG>G</RAG>
    <DOWNSPEED>32500</DOWNSPEED>
    <UPSPEED>7200</UPSPEED>
    <MINRANGE />
    <MAXRANGE />
    <READYDATE />
    <EXCHSTATE>E</EXCHSTATE>
    <CAPACITY />
  </WBCFTTC>
  <EXCHANGECODE>THHT</EXCHANGECODE>
  <EXCHANGENAME>HENLEY-ON-THAMES</EXCHANGENAME>
  <REASONCODE>L</REASONCODE>
  <VPCONTENTION>N</VPCONTENTION>
  <SPNAME />
  <CAD />
  <CPNAME>BE UN LIMITED</CPNAME>
  <CPCONTACTNO>02074795000</CPCONTACTNO>
  <POSTCODE>RG9 1LT</POSTCODE>
  <SUGGESTEDMSG>Your exchange is ADSL enabled, and our initial test on your line indicates that your line should be able to have an ADSL broadband service that provides a fixed line speed up to 2Mbps.
    Our test also indicates that your line currently supports an estimated ADSL Max broadband line speed of 4.5Mbps. Similar lines predicted with this speed have achieved ADSL Max line speeds in the range of 3.5 to 5.5Mbps.
    Our test also indicates that your line currently supports an estimated ADSL2+ broadband line speed of 5.5Mbps. Similar lines predicted with this speed have achieved ADSL2+ line speed in the range of 4.5 to 6.5Mbps.
    Our test also indicates that your line currently supports a fibre technology with an estimated WBC FTTC Broadband where consumers have received downstream line speed of 32.5Mbps and upstream line speed of 7.2Mbps.
    The actual stable line speed supportable will be determined during the first 10 days of use. This speed may change over time, to ensure line stability is maintained.
    If you decide to place an order, a further test will be performed to confirm if your line is suitable for the service you wish to purchase.
    Thank you for your interest.
    Please note that postcode and address check results are indicative only. Most accurate results can be obtained from a telephone number check.
  </SUGGESTEDMSG>
  <SUPPLEMENTARYMSG>Note: If you already have a Broadband service enabled on this line and you want to switch service providers, you will need to contact both your current provider and your new provider to get your service changed over new and existing service provider to have this service transferred.
  </SUPPLEMENTARYMSG>
</ADSL_CHECKER>

出于格式设置目的,对 XML 中的文本进行了轻微修改。 确切地说,请参阅以前的版本。

将 xpath 与 c# 一起使用,帮助

您使用的是哪个版本的 .Net 框架? 如果您使用的是 3.5 或更高版本,我强烈建议您使用 Linq 来处理 XML,这样您将拥有轻松得多的时间。 查看 XDocument 和相关类。

http://msdn.microsoft.com/en-us/library/bb387044.aspx

使用

XmlDocument 实例并将 XML 加载到其中,然后使用 SelectNodes 方法将 xpath 查询作为输入参数传递。

        XmlDocument xmlDocument = new XmlDocument();
        xmlDocument.LoadXml(xmlText);
        var gg = xmlDocument.SelectNodes("//MAX/MINRANGE");

这将为您提供可以循环访问的节点集合。

您需要

捕获iterator.MoveNext()的结果。

XPathNodeIterator iterator = nav.Select(exp);
if (iterator.MoveNext())
{
   XPathNavigator res = iterator.Current;
   string min = res.Value;
}
else 
{
   //Error
}

iterator.MoveNext()不会修改原始nav对象。

实际上有很多不同的方法来选择XmlNode的内容。让我分享一些。(当然,您可以修改代码以使用 Xml 字符串而不是从 Xml 文件加载)

使用 XmlDocument 对象和 SelectSingleNode()

//-----------------------------------------------------------------------------
// <copyright file="Program.cs" company="DCOM Productions">
//     Copyright (c) DCOM Productions.  All rights reserved.
// </copyright>
//-----------------------------------------------------------------------------
namespace ConsoleApplication1 {
    using System;
    using System.Xml;
    class Program {
        static void Main(string[] args) {
            XmlDocument xdoc = new XmlDocument();
            try {
                xdoc.Load(".''App.xml");
            }
            catch (System.Xml.XmlException ex) {
                // handle
            }
            XmlNode node = xdoc.SelectSingleNode("ADSL_CHECKER//MAX//MINRANGE");
            Console.WriteLine(node.InnerText);
            Console.ReadKey(true);
        }
    }
}

使用 XDocument 对象和 Element()

//-----------------------------------------------------------------------------
// <copyright file="Program.cs" company="DCOM Productions">
//     Copyright (c) DCOM Productions.  All rights reserved.
// </copyright>
//-----------------------------------------------------------------------------
namespace ConsoleApplication1 {
    using System;
    using System.Xml;
    using System.Xml.Linq;
    class Program {
        static void Main(string[] args) {
            XDocument xdoc = XDocument.Load(".''App.xml");
            XElement element = xdoc.Element("ADSL_CHECKER").Element("MAX").Element("MINRANGE");
            Console.WriteLine(element.Value);
            Console.ReadKey(true);
        }
    }
}

使用 XDocument 对象和 LINQ 查询

//-----------------------------------------------------------------------------
// <copyright file="Program.cs" company="DCOM Productions">
//     Copyright (c) DCOM Productions.  All rights reserved.
// </copyright>
//-----------------------------------------------------------------------------
namespace ConsoleApplication1 {
    using System;
    using System.Linq;
    using System.Xml;
    using System.Xml.Linq;
    class Program {
        static void Main(string[] args) {
            XDocument xdoc = XDocument.Load(".''App.xml");
            var result = from e in xdoc.Element("ADSL_CHECKER").Element("MAX").Elements()
                         where e.Name == "MINRANGE"
                         select e;
            Console.WriteLine(result.First().Value);
            Console.ReadKey(true);
        }
    }
}

您的 XPath 正确始终很重要,并且一如既往地请参阅 Msdn 文档以获取有关使用 XmlDocument 和 XDocument 的帮助。