2014-12-09 4 views
-2

У меня есть XML, полученный из веб-службы, я использую для этого HttpClient. Это то, что XML выглядит следующим образом:Создание функции синтаксического анализа xml в C#

<respuesta> 
    <entrada> 
    <rut>7059099</rut> 
    <dv>9</dv> 
</entrada> 
<status> 
    <code>OK</code> 
    <descrip>Persona tiene ficha, ok</descrip> 
</status> 
<ficha> 
    <folio>3204525</folio> 
    <ptje>7714</ptje> 
    <fec_aplic>20080714</fec_aplic> 
    <num_integ>2</num_integ> 
    <comuna>08205</comuna> 
    <parentesco>1</parentesco> 
    <fec_puntaje>20070101</fec_puntaje> 
    <personas> 
    <persona> 
     <run>7059099</run> 
     <dv>9</dv> 
     <nombres>JOSE SANTOS</nombres> 
     <ape1>ONATE</ape1> 
     <ape2>FERNANDEZ</ape2> 
     <fec_nac>19521101</fec_nac> 
     <sexo>M</sexo> 
     <parentesco>1</parentesco> 
    </persona> 
    <persona> 
     <run>8353907</run> 
     <dv>0</dv> 
     <nombres>JUANA DEL TRANSITO</nombres> 
     <ape1>MEDINA</ape1> 
     <ape2>ROA</ape2> 
     <fec_nac>19560815</fec_nac> 
     <sexo>F</sexo> 
     <parentesco>2</parentesco> 
    </persona> 
    </personas> 
</ficha> 

Я пытаюсь сделать функцию, которая может анализировать это и сейчас (только для целей тестирования моего понимания языка, так как я» m new to it) мне просто нужно найти VALUE внутри тега «rut», первого, или что-то в этом роде. Точнее, мне нужно найти значение внутри XML и вернуть его, поэтому я могу показать его на ярлыке, который находится на моей странице .aspx. Код моей функции синтаксического анализа выглядит следующим образом:

public static String parseXml(String xmlStr, String tag) 
    { 
     String valor; 
     using (XmlReader r = XmlReader.Create(new StringReader(xmlStr))) 
     { 
      try 
      { 
       r.ReadToFollowing(tag); 
       r.MoveToContent(); 
       valor = r.Value; 
      } 
      catch (Exception ex) 
      { 
       throw new Exception(ex.Message, ex.InnerException); 
      } 
     } 
     return valor; 
    } 

Этот код основан на примере я нашел на YouTube выступили ребята из Microsoft, где они «объясняющих» как использовать анализатор.

Кроме того, эта функция вызывается внутри одной из задач HTTPClient, это он:

protected void rutBTN_Click(object sender, EventArgs e) 
    {              
     if (rutTB.Text != "")        
     { 
      HttpClient client = new HttpClient(); 
      String xmlString = ""; 
      String text = ""; 
      var byteArray = Encoding.ASCII.GetBytes("*******:*******"); //WebService's server authentication 
      client.BaseAddress = new Uri("http://wschsol.mideplan.cl"); 
      var par = "mod_perl/xml/fps-by-rut?rut=" + rutTB.Text; 
      client.DefaultRequestHeaders.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Basic", Convert.ToBase64String(byteArray)); 
      client.GetAsync(par).ContinueWith(
       (requestTask) => 
        { 
         HttpResponseMessage resp = requestTask.Result; 
         try 
         { 
          resp.EnsureSuccessStatusCode(); 
          XmlDocument xmlResp = new XmlDocument();  
          requestTask.Result.Content.ReadAsStreamAsync().ContinueWith(
          (streamTask) => 
          { 
           xmlResp.Load(streamTask.Result);    
           text = xmlResp.InnerXml.ToString(); 
           xmlString = parseXml(text, "rut"); //HERE I'm calling the parsing function, and i'm passing the whole innerXml to it, and the string "rut", so it searches for this tag.  
           Console.WriteLine("BP"); 
          }).Wait(); 
         } 
         catch (Exception ex) 
         { 
          throw new Exception(ex.Message, ex.InnerException); 
         } 
        }).Wait(); 
      testLBL.Text = xmlString; //Finally THIS is the label i want to show the "rut" tag's value to be shown. 
      testLBL.Visible = true; 
     } 
     else 
     { 
      testLBL.Text = "You must enter an RUT number"; 
      testLBL.Visible = true; 
     } 
    } 

Проблема заключается в том, что, когда я поставить некоторые точки останова в функции синтаксического анализа я могу видеть, что это правильно получая строку innerxml (как строку), но она не находит тег, называемый «rut», или, скорее, ничего не обнаруживает, поскольку возвращает пустую строку («»).

Я знаю, что, возможно, это неправильный способ разобрать xmlDocument, поэтому, если кто-то может мне помочь, я действительно буду благодарен.

EDIT: Хорошо, поэтому я не буду просить ни о каком учебном пособии или о таком (я просил не спрашивать вопросы о нобе). Но, в любом случае, пожалуйста, вместо того, чтобы просто отвечать «вам лучше сделать это так», я был бы признателен, если бы вы могли объяснить мне такие вещи, как «Это то, что вы делаете неправильно, и вот почему ваш код не работает», и Тогда говорите мне, как вы, ребята, это сделаете.

Заранее благодарен!

+1

«Вопросы просят нас, чтобы рекомендовать или найти книгу, инструмент, библиотека программного обеспечения, учебник или другие от ресурс-сайт не относятся к теме для переполнения стека, поскольку они склонны привлекать упрямые ответы и спам. Вместо этого опишите проблему и то, что было сделано до сих пор, чтобы ее решить ». – Luizgrs

+0

Вы должны избавиться от этого 'try/catch/throw new Exception'. Исключение будет распространяться без вашей помощи, и вы испортите трассировку стека. –

ответ

1

Поскольку вы хотите получить только одно значение поля, я бы рекомендовал использовать Xpath. В основном вы создаете XPathNavigator из XPathDocument или XMLDOCUMENT, а затем использовать Select, чтобы получить содержимое узла гона:

XPathNavigator navigator = xmlResp.CreateNavigator(); 
XPathNodeIterator rutNode = navigator.SelectSingleNode("/respuesta/entrada/rut"); 
string rut = rutNode.Value 
Смежные вопросы