2011-05-17 70 views
1

我试图选择下面的XML的MINRANGE的内容。这是我正在使用的代码,字符串min只是给我一个长文本块,而不是我想要的节点。使用xpath与c#,帮助

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文本中,它们的目的略作修改。请参阅以前的版本。

回答

1

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

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

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

+0

但是MoveNext()返回一个bool而不是XPathNavigator? – 2011-05-17 13:54:40

+0

@Tom谢谢,需要迭代器的'Current'。 – 2011-05-17 13:59:04

2

您使用的是什么版本的.Net框架?如果您使用的是3.5或更高版本,我强烈建议使用Linq来处理Xml,您将有更容易的时间。查看XDocument和相关的类。

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

+2

即时通讯使用2.0,如果我可以使用Linq它会很容易! – 2011-05-17 12:56:08

+1

@Tom Squires您可以使用LinqBridge(http://code.google.com/p/linqbridge/)在.NET 2.0中使用Linq。我不确定xml qureies,但对于sql工作正常。 – 2011-05-17 13:04:02

2

使用的XmlDocument实例和XML加载到其中,然后用的SelectNodes方法通过你的XPath查询作为输入参数。

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

这会给你一个你可以遍历的节点的集合。

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对象和元素()

//----------------------------------------------------------------------------- 
// <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的帮助。