2017-03-14 14 views
0

属性とネストされたXMLをどのように読み取ることができますか?私は原則を理解していないので、実際の例でこれを教えたいと思います。属性とネストされたXMLを読み取るにはどうすればいいですか

ソースXML:私はDataTableのに追加するユーザーのUUID属性と、すべてのノードを読みたい

<?xml version="1.0" encoding="utf-8"?> 
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"> 
    <soapenv:Body> 
    <ns:listUserResponse xmlns:ns="http://www.cisco.com/AXL/API/11.5"> 
     <return> 
     <user uuid="{A00B47CC-0C4F-40E7-1E25-22E54FBA4596}"> 
      <firstName>Name1</firstName> 
      <middleName /> 
      <lastName>Surname1</lastName> 
      <primaryExtension> 
      <pattern>201</pattern> 
      </primaryExtension> 
     </user> 
     <user uuid="{834E86FA-FDC2-21FE-1E1E-FD164AF23B44}"> 
      <firstName>Name2</firstName> 
      <middleName /> 
      <lastName>Surname2</lastName> 
      <primaryExtension> 
      <pattern>202</pattern> 
      </primaryExtension> 
     </user> 
     <user uuid="{798E04E7-0E10-0278-6FAD-EA6A85EF2B2E}"> 
      <firstName>Name3</firstName> 
      <middleName /> 
      <lastName>Surname3</lastName> 
      <primaryExtension> 
      <pattern>203</pattern> 
      </primaryExtension> 
     </user> 
     </return> 
    </ns:listUserResponse> 
    </soapenv:Body> 
</soapenv:Envelope> 

。しかし、私は、私は属性とネストされたXMLを読むことができるかわからない(エラー:「オブジェクト参照がオブジェクトインスタンスに設定されていません。」)

マイコード:

XmlDocument xmldocListUser = new XmlDocument(); 
xmldocListUser.LoadXml(soapresultListUser); 

// prepare data (like database) 
DataTable datatableListUser = new DataTable(); 
datatableListUser.Clear(); 
datatableListUser.Columns.Add("uuid"); 
datatableListUser.Columns.Add("firstName"); 
datatableListUser.Columns.Add("middleName"); 
datatableListUser.Columns.Add("lastName"); 
datatableListUser.Columns.Add("primaryExtensionPattern"); 

XmlNodeList xnList = xmldocListUser.SelectNodes("//return/user"); 
foreach (XmlNode xn in xnList) 
{ 
    DataRow myDataRow = datatableListUser.NewRow(); 

    myDataRow["firstName"] = xn["firstName"].InnerText; 
    myDataRow["middleName"] = xn["middleName"].InnerText; 
    myDataRow["lastName"] = xn["lastName"].InnerText; 

    // error 
    //myDataRow["uuid"] = xn["@uuid"].InnerText; 

    // error 
    //string xnDN = xn.SelectSingleNode("//primaryExtension/Pattern").InnerXml; 

    // error 

    //XmlElement xmlelementEndUserUserId = xmldocGetPhone.DocumentElement; 
    //string strEndUserUserId = xn.SelectSingleNode("/primaryExtension/Pattern").InnerXml; 
    //myDataRow["primaryExtensionPattern"] = strEndUserUserId; // xn["/primaryExtension/Pattern"].InnerText; 

    datatableListUser.Rows.Add(myDataRow); 
} 

はありがとうと最高敬具、 Petr

答えて

0

てみたXML LINQ

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Data; 
using System.Xml; 
using System.Xml.Linq; 


namespace ConsoleApplication1 
{ 
    class Program 
    { 
     const string FILENAME = @"c:\temp\test.xml"; 
     static void Main(string[] args) 
     { 
      DataTable datatableListUser = new DataTable(); 
      datatableListUser.Clear(); 
      datatableListUser.Columns.Add("uuid"); 
      datatableListUser.Columns.Add("firstName", typeof(string)); 
      datatableListUser.Columns.Add("middleName", typeof(string)); 
      datatableListUser.Columns.Add("lastName", typeof(string)); 
      datatableListUser.Columns.Add("primaryExtensionPattern", typeof(int)); 

      XDocument doc = XDocument.Load(FILENAME); 

      foreach (XElement user in doc.Descendants("user")) 
      { 
       datatableListUser.Rows.Add(new object[] { 
        (string)user.Attribute("uuid"), 
        (string)user.Element("firstName"), 
        (string)user.Element("middleName"), 
        (string)user.Element("lastName"), 
        (int)user.Descendants("pattern").FirstOrDefault() 
       }); 
      } 

     } 
    } 
} 
を解析しやすくなるようです
0

あなたはこのようなものを使うことができます。

foreach (XmlNode xn in xnList) 
    { 
     string uuid = (xn as XmlElement).GetAttribute("uuid"); 
     string firstName = xn.SelectSingleNode("./firstName").InnerText; 
     string middleName= xn.SelectSingleNode("./middleName").InnerText; 
     string lastName = xn.SelectSingleNode("./lastName").InnerText; 
     string primaryExtensionPattern = xn.SelectSingleNode("./primaryExtensionPattern /pattern").InnerText; 

     ... 
    } 

また、Linq to XMLを使用してXElementを使用することを検討することもできます。私にとっては、XMLS

関連する問題