У меня есть 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: Хорошо, поэтому я не буду просить ни о каком учебном пособии или о таком (я просил не спрашивать вопросы о нобе). Но, в любом случае, пожалуйста, вместо того, чтобы просто отвечать «вам лучше сделать это так», я был бы признателен, если бы вы могли объяснить мне такие вещи, как «Это то, что вы делаете неправильно, и вот почему ваш код не работает», и Тогда говорите мне, как вы, ребята, это сделаете.
Заранее благодарен!
«Вопросы просят нас, чтобы рекомендовать или найти книгу, инструмент, библиотека программного обеспечения, учебник или другие от ресурс-сайт не относятся к теме для переполнения стека, поскольку они склонны привлекать упрямые ответы и спам. Вместо этого опишите проблему и то, что было сделано до сих пор, чтобы ее решить ». – Luizgrs
Вы должны избавиться от этого 'try/catch/throw new Exception'. Исключение будет распространяться без вашей помощи, и вы испортите трассировку стека. –