2014-12-02 2 views
0

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

<Z_STU_CRS_TRNS_DOC xmlns="http://testurl"> 
    <Z_STATUS_CODE>0</Z_STATUS_CODE> 
    <Z_STATUS_MSG>Success</Z_STATUS_MSG> 
    <Z_STUDENT_ID_SUB_DOC xmlns="http://testurl"> 
     <Z_STU_ID>000999999</Z_STU_ID> 
    </Z_STUDENT_ID_SUB_DOC> 
    <Z_CRSE_SUB_DOC xmlns="http://testurl"> 
     <Z_COURSE xmlns="http://testurl"> 
      <Z_CRSE_DATA>9999|199901|TEST|9999|1|S|Scuba Diving| |XX</Z_CRSE_DATA> 
     </Z_COURSE> 
     <Z_COURSE xmlns="testurl"> 
      <Z_CRSE_DATA>9999|200001|TEST|999|3|A|English 101| |XX</Z_CRSE_DATA> 
     </Z_COURSE> 
    </Z_CRSE_SUB_DOC> 
</Z_STU_CRS_TRNS_DOC> 

Я могу потреблять услугу и проверить на наличие ошибок, но у меня трудное время фактически получая данные из файла XML XDocument.

protected void webClient_DownloadStringCompleted(object sender, 
               DownloadStringCompletedEventArgs e) 
    { 
     if (e.Error != null) 
      { 
       errorLabel.Text = 
        "The transaction failed. If you feel that you have reached " + 
        "this in error, please contact the help desk at xxx-xxx-xxxx."; 
       errorLabel.Visible = true; 
       return; 
      } 

     XDocument xml = XDocument.Parse(e.Result); 
     XNamespace ns = "http://testurl"; 


     //Look for error code from WS 
     var field = xml.Descendants(ns + "Z_STATUS_CODE").FirstOrDefault(); 
     if (field != null) 
     { 
      if (Convert.ToInt32((string)field.Value) == 1) 
      { 
       errorLabel.Text = 
        "The transaction failed, due to an invalid student id. If you " + 
        "feel that you have reached this in error, please contact " + 
        "the help desk at xxx-xxx-xxxx."; 
       errorLabel.Visible = true; 
       return; 
      } 
     } 

Я пробовал много разных способов, но ничего не помогает. Может кто-нибудь помочь?

+0

Какое сообщение об ошибке? В какой строке это происходит? –

+0

Я предполагаю, что ошибки нет, но поле всегда равно null, когда этого не должно быть. 1) если вы удалите параметр из потомков, например var field = xml.Descendants(). FirstOrDefault(); поле, что вы ожидаете? 2) если это так, я уверен, что это проблема форматирования с (ns + "Z_STATUS_CODE"). Посмотрите на декодеры через код, чтобы увидеть, как пространство имен и имя элемента должны быть отформатированы. Имеет ли это смысл? – MatthewHagemann

+0

В этом коде нет ошибки ... Я просто не могу понять, как получить данные. Я могу получить код состояния. Какие шаги я предпримлю, чтобы получить Z_CRSE_DATA из этого документа? – dianeb

ответ

-1

Вы можете прочитать список узлов и прочитать значения узлов в соответствии с их именем.

Это займет немного больше работы, так как вы должны работать через все узлы сам, но, как это вы могли бы сделать это

class Program 
{ 
    static void Main(string[] args) 
    { 
     string xmldata = @"<Z_STU_CRS_TRNS_DOC xmlns=""http://testurl""> 
<Z_STATUS_CODE>0</Z_STATUS_CODE> 
<Z_STATUS_MSG>Success</Z_STATUS_MSG> 
<Z_STUDENT_ID_SUB_DOC xmlns=""http://testurl""> 
    <Z_STU_ID>000999999</Z_STU_ID> 
</Z_STUDENT_ID_SUB_DOC> 
<Z_CRSE_SUB_DOC xmlns=""http://testurl""> 
    <Z_COURSE xmlns=""http://testurl""> 
     <Z_CRSE_DATA>9999|199901|TEST|9999|1|S|Scuba Diving| |XX</Z_CRSE_DATA> 
    </Z_COURSE> 
    <Z_COURSE xmlns=""testurl""> 
     <Z_CRSE_DATA>9999|200001|TEST|999|3|A|English 101| |XX</Z_CRSE_DATA> 
    </Z_COURSE> 
</Z_CRSE_SUB_DOC> 
</Z_STU_CRS_TRNS_DOC>"; 
     string errorTag = "Z_STATUS_CODE", 
      statusTag = "Z_STATUS_MSG"; 

     XDocument xml = XDocument.Parse(xmldata); 
     XNamespace ns = "http://testurl"; 
     int errorCode = -1; 
     string statusMessage = string.Empty; 

     using (XmlReader reader = xml.CreateReader()) 
     { 
      while (reader.Read()) 
      { 
       if (reader.NodeType != XmlNodeType.Element) 
       { 
        continue; 
       } 
       if (!string.Equals(reader.Name, errorTag) && 
        !string.Equals(reader.Name, statusTag)) 
       { 
        continue; 
       } 
       string currentName = reader.Name; 
       while (reader.Read()) 
       { 
        if (reader.NodeType == XmlNodeType.EndElement) 
        { 
         break; 
        } 
        if (reader.NodeType != XmlNodeType.Text) 
        { 
         continue; 
        } 
        if (string.Equals(currentName, errorTag)) 
        { 
         errorCode = int.Parse(reader.Value); 
        } 
        if (string.Equals(currentName, statusTag)) 
        { 
         statusMessage = reader.Value; 
        } 
        break; 
       } 
      } 
     } 
     if (errorCode == -1) 
     { 
      // no tag found 
      Console.WriteLine("No tag found named: {0}", errorTag); 
     } 
     else if (errorCode == 0) 
     { 
      Console.WriteLine("Operation was a success!"); 
     } 
     else 
     { 
      Console.WriteLine("Operation failed with error code {0}", errorCode); 
     } 
     if (!string.IsNullOrWhiteSpace(statusMessage)) 
     { 
      Console.WriteLine("Status message: {0}", statusMessage); 
     } 
     Console.ReadLine(); 
    } 
} 
0

Я понял это! Проводка в случае, если кто-то другой имеет аналогичную проблему.

List<studentRecord> studentCourses = new List<studentRecord>(); 
    XmlReader reader = xml.CreateReader(); 
    // Get elements 
    while (reader.Read()) 
    { 
     if ((reader.NodeType == XmlNodeType.Element) && (reader.Name == "Z_CRSE_DATA")) 
     { 
      reader.Read(); 
      if (reader.NodeType == XmlNodeType.Text) 
      { 
       studentRecord stuRec = new studentRecord(); 
       stuRec.rawData = reader.Value; 
       studentCourses.Add(stuRec); 
      } 
     } 
    } 
    reader.Close(); 
+0

Итак, вы основали его на моем ответе? Если XMLElement будет иметь атрибут в будущем, это не сработает, поскольку следующий элемент после XmlNodeType.Element - это атрибуты, а затем содержимое (вот почему мой пример имел двойной цикл while) – Icepickle

Смежные вопросы