2011-05-17 5 views
1

Я пытаюсь выбрать содержимое MINRANGE приведенного ниже XML. Это код, который я использую, строка min просто дает мне длинный блок текста, а не тот узел, который я хотел.Использование xpath с C#, help

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? –

+0

@Tom Спасибо, нужен итератор 'Current'. –

2

Какая версия .Net framework вы используете? Если вы используете 3.5 или выше, я настоятельно рекомендую использовать Linq для работы с Xml, вам будет намного легче. Проверьте XDocument и связанные с ним классы.

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

+2

Im используя 2.0, если бы я мог использовать Linq, было бы легко! –

+1

@Tom Squires Вы можете использовать Linq в .NET 2.0, используя LinqBridge (http://code.google.com/p/linqbridge/). Однако я не уверен в xml qureies, но для sql отлично работает. –

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 и 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.