无法将 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未将对象引用到实例