使用xpath和c#,帮助

时间:2011-05-17 12:45:59

标签: c# xpath

我正在尝试选择以下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中的文本。请参阅先前版本的确切。

4 个答案:

答案 0 :(得分:2)

您使用的是什么版本的.Net框架?如果你使用3.5或更高版本,我强烈建议使用Linq来使用Xml,你会有更轻松的时间。查看XDocument及相关类。

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

答案 1 :(得分:2)

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

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

这将为您提供可以迭代的节点集合。

答案 2 :(得分:1)

您需要捕获iterator.MoveNext()的结果。

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

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

答案 3 :(得分:0)

实际上有很多不同的方法可以选择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的帮助。