峰峦@叠嶂 2025-05-29 10:42 采纳率: 98%
浏览 10
已结题

XML文件读取提示格式错误的问题

请问一下,我的C#代码需要读取XML格式的文件,从里面读取时间、发货时间号和大箱码这几个字段,但目前该扫描枪设备,读取两类名称的文件,只有其中一种可以正常读取出来,另一种都提示格式错误,请问怎么解决,读取代码如下:

  public List<XmlDataRecord> ParseXml(string xmlPath) //从XML文件中,取到箱码、出库单号,及发货时间;
  {
      var doc = XDocument.Load(xmlPath);
      var records = new List<XmlDataRecord>();

      foreach (var data in doc.Descendants("Data"))
      {
          records.Add(new XmlDataRecord
          {
              BigBoxCode = data.Attribute("Code")?.Value,
              ShipmentNo = data.Attribute("CorpOrderID")?.Value,
              ShipmentTime = DateTime.Parse(data.Attribute("ActDate")?.Value)
          });
      }

      return records;
  }

正常读取的文件格式内容是如下:

<?xml version="1.0" encoding="utf-8"?>
<Document xmlns:xs="http://www.w3.org/2001/XMLSchema-instance" xmlns:noNamespaceSchemaLocation="终端接口XML Schema-3.0.xsd" Version="3.0">
  <Events>
    <Event Name="ReturnWareHouseIn" MainAction="WareHouseIn">
      <DataField>
        <Data OwnerCorpID="" ToCorpID="" WrongCode="False" ActDate="2025-05-15 02:40:06" Actor="1" CorpOrderID="250515066164" Code="83014940284536853478" />
        <Data OwnerCorpID="" ToCorpID="" WrongCode="False" ActDate="2025-05-15 02:40:05" Actor="1" CorpOrderID="250515066164" Code="83014940285815666475" />
      </DataField>
    </Event>
  </Events>
</Document>

提示格式错误的内容如下:

<?xml version="1.0" encoding="utf-8"?>
<Document xmlns:xs="http://www.w3.org/2001/XMLSchema-instance" xmlns:noNamespaceSchemaLocation="终端接口XML Schema-3.0.xsd" Version="3.0">
  <Events>
    <Event Name="SalesWareHouseOut" MainAction="WareHouseOut">
      <DataField>
        <Data OwnerCorpID="" ToCorpID="" WrongCode="False" ActDate="2025-04-09 10:24:34" Actor="1" CorpOrderID="250409065617" Code="87017930000504432362" />
      </DataField>
    </Event>
  </Events>
</Document>

  • 写回答

5条回答 默认 最新

  • 檀越@新空间 2025-05-29 10:43
    关注

    上午好☀️☀️☀️️
    本答案参考通义千问

    分析问题

    从你的描述来看,问题的核心在于两种 XML 文件结构略有不同,导致代码无法正确解析第二种文件格式。具体来说:

    1. 正常读取的文件

      • <Event>Name 属性为 "ReturnWareHouseIn"
      • <DataField> 包含多个 <Data> 元素。
    2. 提示格式错误的文件

      • <Event>Name 属性为 "SalesWareHouseOut"
      • <DataField> 只包含一个 <Data> 元素。

    因此,问题可能出在代码逻辑中,假设所有 <Event> 下的 <DataField> 都包含多个 <Data> 元素。当 <DataField> 只有一个 <Data> 元素时,代码可能会抛出异常或无法正确解析。


    解决方案

    我们需要对代码进行以下改进:

    1. 检查 <Event>Name 属性

      • 如果 <Event>Name 属性为 "SalesWareHouseOut",则需要特殊处理,因为它的 <DataField> 只包含一个 <Data> 元素。
    2. 确保 <DataField> 中有 <Data> 元素

      • 在遍历 <DataField> 时,检查是否存在 <Data> 元素,并处理空的情况。

    以下是修改后的代码:

    public List<XmlDataRecord> ParseXml(string xmlPath) // 从XML文件中,取到箱码、出库单号,及发货时间
    {
        var doc = XDocument.Load(xmlPath);
        var records = new List<XmlDataRecord>();
    
        foreach (var eventElement in doc.Descendants("Event"))
        {
            string eventName = eventElement.Attribute("Name")?.Value;
    
            // 根据 Event 的 Name 属性判断处理方式
            if (eventName == "ReturnWareHouseIn")
            {
                // 处理包含多个 Data 的情况
                foreach (var data in eventElement.Descendants("DataField").Descendants("Data"))
                {
                    records.Add(new XmlDataRecord
                    {
                        BigBoxCode = data.Attribute("Code")?.Value,
                        ShipmentNo = data.Attribute("CorpOrderID")?.Value,
                        ShipmentTime = DateTime.Parse(data.Attribute("ActDate")?.Value)
                    });
                }
            }
            else if (eventName == "SalesWareHouseOut")
            {
                // 处理只包含一个 Data 的情况
                var dataElement = eventElement.Descendants("DataField").Elements("Data").FirstOrDefault();
                if (dataElement != null)
                {
                    records.Add(new XmlDataRecord
                    {
                        BigBoxCode = dataElement.Attribute("Code")?.Value,
                        ShipmentNo = dataElement.Attribute("CorpOrderID")?.Value,
                        ShipmentTime = DateTime.Parse(dataElement.Attribute("ActDate")?.Value)
                    });
                }
                else
                {
                    // 如果没有找到 Data 元素,记录日志或跳过
                    Console.WriteLine("Warning: No Data element found for SalesWareHouseOut event.");
                }
            }
            else
            {
                // 如果遇到未知的 Event,记录日志或跳过
                Console.WriteLine($"Warning: Unknown Event Name: {eventName}");
            }
        }
    
        return records;
    }
    

    修改点说明

    1. 动态处理 <Event>Name 属性

      • 使用 eventName 变量存储 <Event>Name 属性值,并根据其值选择不同的处理逻辑。
    2. 处理只有一个 <Data> 元素的情况

      • 使用 FirstOrDefault() 方法获取 <DataField> 下的第一个 <Data> 元素。
      • 如果 <Data> 元素不存在,则记录警告信息并跳过。
    3. 增加日志记录

      • 对于未知的 <Event> 或缺少 <Data> 元素的情况,添加日志输出,便于调试和排查问题。

    测试用例

    输入文件 1(正常读取的文件)

    <?xml version="1.0" encoding="utf-8"?>
    <Document xmlns:xs="http://www.w3.org/2001/XMLSchema-instance" xmlns:noNamespaceSchemaLocation="终端接口XML Schema-3.0.xsd" Version="3.0">
      <Events>
        <Event Name="ReturnWareHouseIn" MainAction="WareHouseIn">
          <DataField>
            <Data OwnerCorpID="" ToCorpID="" WrongCode="False" ActDate="2025-05-15 02:40:06" Actor="1" CorpOrderID="250515066164" Code="83014940284536853478" />
            <Data OwnerCorpID="" ToCorpID="" WrongCode="False" ActDate="2025-05-15 02:40:05" Actor="1" CorpOrderID="250515066164" Code="83014940285815666475" />
          </DataField>
        </Event>
      </Events>
    </Document>
    

    输入文件 2(提示格式错误的文件)

    <?xml version="1.0" encoding="utf-8"?>
    <Document xmlns:xs="http://www.w3.org/2001/XMLSchema-instance" xmlns:noNamespaceSchemaLocation="终端接口XML Schema-3.0.xsd" Version="3.0">
      <Events>
        <Event Name="SalesWareHouseOut" MainAction="WareHouseOut">
          <DataField>
            <Data OwnerCorpID="" ToCorpID="" WrongCode="False" ActDate="2025-04-09 10:24:34" Actor="1" CorpOrderID="250409065617" Code="87017930000504432362" />
          </DataField>
        </Event>
      </Events>
    </Document>
    

    输出结果

    对于上述两个文件,代码都能正确解析并返回相应的记录。


    总结

    通过动态处理 <Event>Name 属性,并对 <DataField><Data> 元素进行空值检查,代码可以兼容两种文件格式。如果仍有问题,可以通过日志进一步分析文件的具体结构。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(4条)

报告相同问题?

问题事件

  • 系统已结题 9月5日
  • 已采纳回答 8月28日
  • 创建了问题 5月29日