0

我正在尝试遍历 Xml 文件并在消息中显示类型的值。但我的代码反复给他第一个记录值。

下面是我的 XML

<Request deploymentMode="test">
  <ConfirmationRequest>
    <ConfirmationHeader noticeDate="2019-10-03T01:53:54+0200" type="accept" operation="new" confirmID="0002933085">...</ConfirmationHeader>
    <OrderReference orderID="50084">...</OrderReference>
    <ConfirmationItem lineNumber="000010" quantity="16.000">
      <UnitOfMeasure>CT</UnitOfMeasure>
      <ConfirmationStatus type="rejected" quantity="16.000">
        <UnitOfMeasure>CT</UnitOfMeasure>
        <Comments>ConfirmedQuantity:0.000</Comments>
        <Comments>reject reason: EDI 855 Rejected: Out of Stock</Comments>
      </ConfirmationStatus>
    </ConfirmationItem>
    <ConfirmationItem lineNumber="000020" quantity="144.000">
      <UnitOfMeasure>CT</UnitOfMeasure>
      <ConfirmationStatus deliveryDate="2019-10-02T07:00:00+0200" type="accepted" quantity="144.000">
        <UnitOfMeasure>CT</UnitOfMeasure>
        <Comments>ConfirmedQuantity:144.000</Comments>
      </ConfirmationStatus>
    </ConfirmationItem>
    <ConfirmationItem lineNumber="000030" quantity="45.000">
      <UnitOfMeasure>CT</UnitOfMeasure>
      <ConfirmationStatus deliveryDate="2019-10-02T07:00:00+0200" type="partial-accept" quantity="45.000">
        <UnitOfMeasure>CT</UnitOfMeasure>
        <Comments>ConfirmedQuantity:45.000</Comments>
        <Comments>Partial Accept reason -Out of Stock etc.</Comments>
      </ConfirmationStatus>
    </ConfirmationItem>
    <ConfirmationItem lineNumber="000040" quantity="65.000">
      <UnitOfMeasure>CT</UnitOfMeasure>
      <ConfirmationStatus deliveryDate="2019-10-02T07:00:00+0200" type="accepted" quantity="65.000">
        <UnitOfMeasure>CT</UnitOfMeasure>
        <Comments>ConfirmedQuantity:65.000</Comments>
      </ConfirmationStatus>
    </ConfirmationItem>
  </ConfirmationRequest>
</Request>

我的代码如下。

XmlNodeList xnList = xmlDoc.SelectNodes("//ConfirmationRequest/ConfirmationItem");

                    foreach (XmlNode xn in xnList)
                    {
                     OrderNumber = null;
                        LineNumber = 0;
                        Quantity = 0;
                        UnitOfMeasure = null;
                        DeliveryDate = null;
                        Type = null;
                        ConfirmationStatus_Quantity = 0;
                        ConfirmationStatus_Unitofmeasure = null;
                        LineitemComments_1 = null;
                        LineitemComments_2 = null;
                        LineitemComments_3 = null;
                        LineitemComments_4 = null;
                        LineitemComments_5 = null;
                        CreatedDate = null;

                        XmlNode orh = xmlDoc.SelectSingleNode("//Request/ConfirmationRequest/OrderReference");
                        OrderNumber = (orh.Attributes["orderID"].Value == null) ? null : orh.Attributes["orderID"].Value;
                        LineNumber = int.Parse(xn.Attributes[0].Value == null ? null : xn.Attributes[0].Value);
                        Quantity = Convert.ToDecimal(xn.Attributes[1].Value == null ? null : xn.Attributes[1].Value);
                        UnitOfMeasure = xn.SelectSingleNode("UnitOfMeasure").InnerText == null ? null : xn.SelectSingleNode("UnitOfMeasure").InnerText;
                        DeliveryDate = xn.SelectSingleNode("//Request/ConfirmationRequest/ConfirmationItem/ConfirmationStatus/@deliveryDate").InnerText == null ? null : xn.SelectSingleNode("//Request/ConfirmationRequest/ConfirmationItem/ConfirmationStatus/@deliveryDate").InnerText;
                        DeliveryDate = DeliveryDate.Substring(0, 10);
                        Type = xn.SelectSingleNode("//Request/ConfirmationRequest/ConfirmationItem/ConfirmationStatus/@type").InnerText == null ? null : xn.SelectSingleNode("//Request/ConfirmationRequest/ConfirmationItem/ConfirmationStatus/@type").InnerText;

                    }

在每次迭代中,我都得到了几乎所有的值,除了

  1. ConfirmationStatus 标记的属性字符串 DeliveryDate。
  2. ConfirmationStatus 标记的属性字符串类型。

交付日期和类型不会随着每次迭代而改变。

我得到的每个循环都低于结果。

循环 -1: DeliveryDate:2019-10-02T07:00:00+0200,类型 = 拒绝。
循环 -2: DeliveryDate:2019-10-02T07:00:00+0200,类型 = 拒绝。
循环 -3: DeliveryDate:2019-10-02T07:00:00+0200,类型 = 拒绝。
循环 -4: DeliveryDate:2019-10-02T07:00:00+0200,类型 = 拒绝。

您可以在哪里看到这些类型的值对于每个循环都是不同的,并且循环 1 没有交付日期。

我环顾了相关的解决方案,找不到任何解决方案。

回答

弄清楚我到底在哪里犯了错误。

我应该使用

**xn.SelectSingleNode("ConfirmationStatus/@deliveryDate").InnerText**
**xn.SelectSingleNode("ConfirmationStatus/@type").InnerText**

代替

xn.SelectSingleNode("//Request/ConfirmationRequest/ConfirmationItem/ConfirmationStatus/@deliveryDate").InnerText
xn.SelectSingleNode("//Request/ConfirmationRequest/ConfirmationItem/ConfirmationStatus/@type").InnerText

上面的语句总是第一次出现,因此我只得到相同的值。**

不确定我是否在某个地方犯了错误。

请建议。

谢谢。

4

1 回答 1

0

Use xml serialization :

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

namespace ConsoleApplication1
{
    class Program
    {
        const string FILENAME = @"c:\temp\test.xml";
        static void Main(string[] args)
        {

            XmlReader reader = XmlReader.Create(FILENAME);

            XmlSerializer serializer = new XmlSerializer(typeof(Request));
            Request request = (Request)serializer.Deserialize(reader);
        }
    }
    public class Request
    {
        [XmlAttribute]
        public string deploymentMode { get; set; }

        public ConfirmationRequest ConfirmationRequest { get; set; } 
    }
    public class ConfirmationRequest
    {
        public ConfirmationHeader ConfirmationHeader { get; set; }
        public OrderReference OrderReference { get; set; }
        [XmlElement]
        public List<ConfirmationItem> ConfirmationItem { get; set; }
    }
    public class ConfirmationHeader
    {
        private DateTime _noticeDate { get; set; }

        [XmlAttribute]
        public string noticeDate {
            get { return _noticeDate.ToString(); }
            set { _noticeDate = DateTime.Parse(value); } 
        }
        [XmlAttribute]
        public string type { get; set; }
        [XmlAttribute]
        public string opertion { get; set; }
        [XmlAttribute]
        public string confirmID { get; set; }


    }
    public class OrderReference
    {
        [XmlAttribute]
        public string orderID { get; set; }

        public string value { get; set; }
    }
    public class ConfirmationItem
    {
        [XmlAttribute]
        public string lineNumber { get; set; }
        [XmlAttribute]
        public decimal quantity { get; set; }
        public string UnitOfMeasure { get; set; }
        public ConfirmationStatus ConfirmationStatus { get; set; } 
    }
    public class ConfirmationStatus
    {
        [XmlAttribute]
        public string type { get; set; }
        [XmlAttribute]
        public decimal quantity { get; set; }
        public string UnitOfMeasure { get; set; }

        [XmlElement]
        public string[] Comments { get; set; }

    }

}
于 2019-10-09T07:28:07.587 回答