7

私はそれらのサブノードを抽出しようとしていますが、これまでのところ頭痛がしました...

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<soapenv:Body>
  <supplyCrew xmlns="http://site.ddf.com">
     <login>
        <login>XXXX</login>
        <password>XXXX</password>
     </login>
     <flightInformation>
        <flights>
           <item>
              <arrivalDateTime>2010-11-08T22:48:00.000Z</arrivalDateTime>
              <arrivingCity>ORD</arrivingCity>
              <crewMembers>
                 <item>
                    <employeeId>020040</employeeId>
                    <isDepositor>Y</isDepositor>
                    <isTransmitter>N</isTransmitter>
                 </item>
                 <item>
                    <employeeId>09000</employeeId>
                    <isDepositor>N</isDepositor>
                    <isTransmitter>Y</isTransmitter>
                 </item>
              </crewMembers>
           </item>
           <item>
              <arrivalDateTime>2010-11-08T20:29:00.000Z</arrivalDateTime>
              <arrivingCity>JFK</arrivingCity>
              <crewMembers>
                 <item>
                    <employeeId>0538</employeeId>
                    <isDepositor>Y</isDepositor>
                    <isTransmitter>N</isTransmitter>
                 </item>
                 <item>
                    <employeeId>097790</employeeId>
                    <isDepositor>N</isDepositor>
                    <isTransmitter>Y</isTransmitter>
                 </item>

コードで取得できますが、タグ名でそれぞれを選択してデータベースに挿入する方法がわかりません。

XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load("C:/Crew_Request_Sample.xml"); 
XmlNodeList elemList = xmlDoc.GetElementsByTagName("item");
foreach (XmlNode node in elemList)
{
    Debug.WriteLine(node.InnerText);
}

方向性が必要です。

4

3 に答える 3

7

ここでの使用に関する問題は、ノードGetElementsByTagName("item")のレベルが2つあることです。1つはの子として、もう1つはの子としてのアイテムです。itemflightscrewMembers

編集完全なxmlが貼り付けられたので、名前空間も含まれていることは明らかです。名前空間を処理するには、名前空間マネージャーを使用して名前空間のエイリアスを定義します。これをxpathクエリで使用できます。

var nsm = new XmlNamespaceManager(xmlDoc.NameTable);
nsm.AddNamespace("s", "http://site.ddf.com");
var elemList = xmlDoc.SelectNodes("//s:crewMembers/s:item", nsm);
foreach (var node in elemList)
{
    Debug.WriteLine(node.SelectSingleNode("s:employeeId", nsm).InnerText);
    Debug.WriteLine(node.SelectSingleNode("s:isDepositor", nsm).InnerText);
    Debug.WriteLine(node.SelectSingleNode("s:isTransmitter", nsm).InnerText);
}
于 2012-10-04T13:47:46.913 に答える
3

LINQ2XMLを使用してそれを行うことができます。

XElement doc=XElement.Load("C:/Crew_Request_Sample.xml"); 
XNamespace e = "http://schemas.xmlsoap.org/soap/envelope/";
XNamespace s = "http://site.ddf.com";
//this would access the nodes of item->crewMembers->item and put it into an Anonymous Type

var yourList=doc.Descendants(e+"Body")
.Descendants(s+"supplyCrew")
.Descendants(s+"flightInformation")
.Descendants(s+"flights")
.Descendants(s+"item")
.Descendants(s+"crewMembers")
.Descendants(s+"item")
.Select(
x=>new
{
//Anonymous Type
employeeId=x.Element(s+"employeeId").Value,
isDepositor=x.Element(s+"isDepositor").Value,
isTransmitter=x.Element(s+"isTransmitter").Value
}
);

次に、for-eachループを使用してyourListにアクセスできます

foreach(var item in yourList)
{

Console.WriteLine(item.employeeId);
Console.WriteLine(item.isDepositor);
Console.WriteLine(item.isTransmitter);
}
于 2012-10-04T13:56:30.867 に答える
2

このテクニックを使えば、もっと速く簡単にできると思います

Linq To XML

サイトにはたくさんの例があるので、欲しいものを簡単に見つけることができます。それが役に立てば幸い。

于 2012-10-04T13:47:21.833 に答える