2

私は最近、仕事でいくつかの決定があったため、VB.NET から C# に焦点を切り替えました。XML ファイルからデータを読み込もうとしているときに、1 つの問題が発生しました。

では、XML は次のようになります。

<?xml version="1.0" encoding="utf-8"?>
<shipmentdata>
    <shipment shipmentid="70716481780000102" messageid="2">
        <msgcreated>2012-06-14T10:44:00</msgcreated>
        <orderdate>2012-06-14</orderdate>
        <services>
            <baseservice ediid="ZG8">Replenishment</baseservice>
            <addedservices>
                <addedservice id="2" ediid="Z47">Installation</addedservice>
                <addedservice id="3" ediid="Z45">Swap</addedservice>
            </addedservices>
        </services>
        <weight uom="KGM">2</weight>
        <bulkref>123456</bulkref>
    </shipment>
</shipmentdata>

私が持っているC#コードはこれです:

private DataSet ReturnServices(string FileName)
{
    XmlDocument m_xmld = new XmlDocument();
    XmlNodeList m_nodelist;
    m_xmld.Load(FileName);
    m_nodelist = m_xmld.SelectNodes("/shipmentdata");

    DataRow aDR;
    DataTable aDT = new DataTable("AddedServices");
    aDT.Columns.Add("ediid",typeof(string));
    aDT.Columns.Add("shipmentid",typeof(string));
    DataSet oDS = new DataSet("EDIinfo");

    foreach (XmlElement m_node in m_nodelist)
    {
        ShipmentID = m_node["shipment"].Attributes.
            GetNamedItem("shipmentid").Value.ToString();

        XmlNodeList s_nodelist = m_xmld.SelectNodes(
            "/shipmentdata/shipment/services/addedservices");

        foreach (XmlElement s_node in s_nodelist)
        {
            aDR = aDT.NewRow();
            aDR["ediid"] = s_node.ChildNodes.Item(0).Attributes.
                GetNamedItem("ediid").Value.ToString();
            aDR["shipmentid"] = ShipmentID;
            aDT.Rows.Add(aDR);
        }
    }
    oDS.Tables.Add(aDT);
    return oDS;
}

ここでの問題は、ファイルに 2 つの追加サービス (Z47 および Z45) が含まれているにもかかわらず、何らかの理由で最初のノードのみが DataTable (Z47) に格納されることです。追加されたすべてのサービス ノードをループするにはどうすればよいですか?

何か助けていただければ幸いです。私はしばらくこれに固執しており、おそらく抜け出すのが難しい一連の思考と論理に行き詰まっていることに気づき始めました。:P

4

1 に答える 1

2

このループ

foreach (XmlElement s_node in s_nodelist)
{
      aDR = aDT.NewRow();
      aDR["ediid"] = s_node.ChildNodes.Item(0).Attributes.
          GetNamedItem("ediid").Value.ToString();
      aDR["shipmentid"] = ShipmentID;
      aDT.Rows.Add(aDR);
  }

"/shipmentdata/shipment/services/addedservices"xpath ステートメントによって返されるノードは 1 つだけであるため、1 回だけ反復します。次に、ここで最初の追加サービス ノードを取得しますがaDR["ediid"] = s_node.ChildNodes.Item(0).Attributes. GetNamedItem("ediid").Value.ToString(); 、2 番目には決して移動しません。おそらく、それらもループするつもりでした。

于 2012-06-16T12:01:27.740 に答える