gpt4 book ai didi

c# - 具有不同值的字段的 .NET XML 反序列化

转载 作者:太空宇宙 更新时间:2023-11-03 12:52:10 25 4
gpt4 key购买 nike

我有以下 XML:

<results>
<row>
<id>4990321</id>
<field name="First name">John</field>
<field name="Last name">Snow</field>
<field name="Country">USA</field>
<field name="City">San-Diego</field>
<field name="Postcode">123456</field>
<field name="Email">username@stackoverflow.com</field>
<field name="Message">Hello</field>
</row>
<row>
...
<row>
</results>

我需要在对象数组中反序列化它:

public class Employee
{
public string Id { set; get; }
public string Firstname { set; get; }
public string Lastname { set; get; }
public string Country { set; get; }
public string City { set; get; }
public string Postcode { set; get; }
public string Email { set; get; }
public string Message { set; get; }
}

我尝试使用 XmlElementAttributeXmlAttributeAttribute 来实现它,但是名为 ElementName 的属性不理解 XPath,所以我不能t 获取特定字段的值(如 field[name='Email'])

谁知道我该怎么做?无需 XDocument 解析即可。

最佳答案

一个建议是将您的数据预处理为一种更易于通过 XSLT 转换进行序列化的形式。这可以通过 XslCompiledTransform 在 C# 中完成类。

要使用的示例 XSL 文件是:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output encoding="UTF-8" indent="yes" method="xml" standalone="no" omit-xml-declaration="no"/>
<xsl:template match="results">
<Employees>
<xsl:for-each select="row">
<Employee>
<Id><xsl:value-of select="id" /></Id>
<Firstname><xsl:value-of select="field[@name='First name']" /></Firstname>
<Lastname><xsl:value-of select="field[@name='Last name']" /></Lastname>
<Country><xsl:value-of select="field[@name='Country']" /></Country>
</Employee>
</xsl:for-each>
</Employees>
</xsl:template>
</xsl:stylesheet>

(不完整但足以说明目的)

在您的 C# 程序中,转换很简单:

var xslReader = XmlReader.Create(new StringReader(GetXslString()));
var xmlReader = XmlReader.Create(new StringReader(GetXmlString()));

var transformedStream = new MemoryStream();

var xmlWriter = XmlWriter.Create(transformedStream);
var xslt = new XslCompiledTransform();

xslt.Load(xslReader);
xslt.Transform(xmlReader, xmlWriter);

transformedStream.Seek(0, SeekOrigin.Begin);

// Use your transformedStream to deserialize the object

.NET fiddle 演示此代码 here

当它针对您的示例数据运行时,它会产生类似于以下的输出:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<Employees>
<Employee>
<Id>4990321</Id>
<Firstname>Jhon</Firstname>
<Lastname>Snow</Lastname>
<Country>USA</Country>
</Employee>
<Employee>
<Id>4990322</Id>
<Firstname>Mike</Firstname>
<Lastname>Ross</Lastname>
<Country>UK</Country>
</Employee>
</Employees>

现在对于任何默认的反序列化工具来说,在没有高级文档选择器等的情况下接管应该相当容易。

关于c# - 具有不同值的字段的 .NET XML 反序列化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35156288/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com