c# - 陷入 C# 中循环 XML 的思路中

标签 c# xml

由于工作中的一些决定,我最近将重点从 VB.NET 转向了 C#。 我现在在尝试从 XML 文件中读取数据时遇到一个问题。

这里,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;
}

这里的问题是,虽然该文件包含两个添加服务(Z47 和 Z45),但由于某种原因,只有第一个节点存储在数据表(Z47)中。如何循环访问所有添加的服务节点?

任何帮助将不胜感激,我已经被困在这个问题上有一段时间了,并开始意识到我可能陷入了一系列难以摆脱的思维和逻辑。 :P

最佳答案

这个循环

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 语句仅返回一个节点。然后你在这里得到第一个添加的服务节点aDR["ediid"] = s_node.ChildNodes.Item(0).Attributes。 GetNamedItem("ediid").Value.ToString(); ,但永远不要去第二个。您可能也想循环播放这些内容。

关于c# - 陷入 C# 中循环 XML 的思路中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11063162/

相关文章:

c# - 我应该如何处理 C# 到 JSON 序列化和循环引用?

c# - 同时自动检测 COM-Port 和 WriteLine

c# - 删除所有现有的 excel 图表系列

java - 水平滚动文本性能问题

python - 如何从 DOC(而不是 DOCX)获取 XML?

xml - 如何使用 Axis2 和 Rampart 在 SOAP 请求中添加 MessageID

c# - 是否可以运行托管在 Windows 服务中的 Orleans

c# - 我可以使用 Serilog 登录到单独的文件吗?

java - 如何解决第三方 XML 架构冲突?

android数据绑定(bind)不起作用