无法将 XML 读取到对象

Posted

技术标签:

【中文标题】无法将 XML 读取到对象【英文标题】:Unable to read XML to object 【发布时间】:2021-06-12 19:08:34 【问题描述】:

我可以在 C# 中将此 xml 作为对象读取时使用一些帮助,我遇到的问题是“ExtensionData”元素,我可以读取此 xml 中的所有内容,除了该元素内的内容,我也不明白为什么我按原样接收此 xml,我无法以任何方式更改它。我尝试将其粘贴为 Visual Studio 中的类,以及使用各种网站对其进行转换,但没有一个能够将该节点转换为对象。

<BufferEntitiesContainer>
    <HeaderComandaBufferEntities>
      <HeaderComandaBufferEntity>
          <ProfilImportId>25</ProfilImportId>
          <OrderNumber>999872748</OrderNumber>
          <OrderDate>2021-03-12</OrderDate>
          <BuyerILN>12345600</BuyerILN>
          <BuyerName>CLIENT B2C</BuyerName>
          <SalesDepartment>Vanzare WEB</SalesDepartment>
          <Warehouse>A01</Warehouse>
          <OrderCurrency>RON</OrderCurrency>
          <DocumentFunctionCode>WB2C</DocumentFunctionCode>
          <Remarks></Remarks>
          <PaymentType></PaymentType>
          <DeliveryPointILN>CIP-NX</DeliveryPointILN>
          <OrderSerial>WB2C</OrderSerial>
          <PaymentTerm></PaymentTerm>
          <ExpectedDeliveryDate>2021-03-12</ExpectedDeliveryDate>
          <ExtensionData><![CDATA[<ExtensionData>
          <ExtensionFields>
            <ExtensionTemplateID>3</ExtensionTemplateID>
                <Fields>
                    <Root>
                      <Avans>0</Avans>
                      <PerioadaValabilitate dataInceput="1900-01-02" dataFinala="2078-12-31" />
                      <DS_CLIENT_ID>--</DS_CLIENT_ID>
                      <Nume_client>DAN NEDELCU</Nume_client>
                      <Adr_cod_post>011618</Adr_cod_post>
                      <Adr_judet>BUCURESTI</Adr_judet>
                      <Adr_loc>SECTOR 1</Adr_loc>
                      <Adr_str>NAUM</Adr_str>
                      <Adr_nr>1</Adr_nr>
                      <Adr_bl>1</Adr_bl>
                      <Adr_et>1</Adr_et>
                      <Adr_ap>1</Adr_ap>
                      <Adr_sect></Adr_sect>
                      <Nr_tel>0744835647</Nr_tel>
                      <Inf_gen>--</Inf_gen>
                      <Tip_pl>false</Tip_pl>
                      <Link_fact>--</Link_fact>
                      <Taxa_tr>0</Taxa_tr>
                      <Cupon_reducere>0</Cupon_reducere>
                      <CNP></CNP>
                    </Root>
                </Fields>
          </ExtensionFields>
     </ExtensionData>]]></ExtensionData>
          <OrderLines>
              <DetaliuComanda>
<BuyerItemCode></BuyerItemCode>
<EAN>LEDLC-A6010E27/BC-WL</EAN>
<Remarks>Bec cu led A60 E27 10W 230V lumina rece Basic Well</Remarks>
<OrderedQuantity>1</OrderedQuantity>                                      
<OrderedUnitNetPrice>8.8353</OrderedUnitNetPrice>
<UnitOfMeasure></UnitOfMeasure>
<Warehouse>A01</Warehouse>
</DetaliuComanda>
          </OrderLines>
      </HeaderComandaBufferEntity>
</HeaderComandaBufferEntities>
</BufferEntitiesContainer>

【问题讨论】:

ExtensionData 元素实际上只是一个字符串,我希望它在您的对象模型中表示为字符串 - 然后您需要解析 XML within 那个字符串分开。 我注意到了,但我不知道如何将该文本转换为另一个对象... 谈到why的原因,CDATA 通常在 xml 中用于传输数据,否则会生成无效的 xml 文档。如前所述,它的值是一个字符串,而不是 xml,除非你采取另一个步骤来解析它。 嗯,我需要将数据插入到各个字段中,所以我必须将该字符串解析为一个对象。 您可以按照解析原始文档的方式进行操作。将值作为字符串提取出来,然后将该字符串解析为 xml 并将其反序列化为您的对象。 【参考方案1】:

我设法通过这种方式将字符串解析为一个对象:

XmlSerializer xmlSerializer = new XmlSerializer(typeof(BufferEntitiesContainer));
StreamReader streamReader = new StreamReader($@"salesOrdersPathfile");
BufferEntitiesContainer so = (BufferEntitiesContainer)xmlSerializer.Deserialize(streamReader);
Console.WriteLine(so.HeaderComandaBufferEntities.HeaderComandaBufferEntity.ExtensionData);

XmlSerializer xmlInnerSerializer = new XmlSerializer(typeof(ExtensionData));
StringReader reader = new StringReader(so.HeaderComandaBufferEntities.HeaderComandaBufferEntity.ExtensionData);
ExtensionData soInner = (ExtensionData)xmlInnerSerializer.Deserialize(reader);

Console.WriteLine(soInner.ExtensionFields.Fields.Root.Nume_client);

所以如果有人再次遇到这个问题,解决方案是我创建了一个 ExtensionData 类型的对象,然后我使用 StringReader 将内部 xml 字符串反序列化为该对象。

感谢所有给我建议的人。

【讨论】:

以上是关于无法将 XML 读取到对象的主要内容,如果未能解决你的问题,请参考以下文章

无法将类型为“System.Xml.XmlComment”的对象强制转换为类型“System.Xml.XmlElement”

将对象数组添加到突变 react-graphql-apollo-mongoose 时,“无法读取未定义的属性 'get'”

映射异常:在 JPA 2.0 中外部化命名本机查询时无法读取 XML

HttpContext.Current.Server未将对象引用到实例

从 1.2.8.RELEASE 升级到 1.3.8.RELEASE 后无法读取 settings.xml

C# 在忽略命名空间的同时反序列化 xml