gpt4 book ai didi

c# - 将 cXML 反序列化为 C# 类

转载 作者:行者123 更新时间:2023-12-04 12:47:48 25 4
gpt4 key购买 nike

我正在尝试将 cXML 字符串反序列化为 C# 类。但是,在反序列化时,除了要反序列化的根元素之外,我似乎无法获得任何东西。 How to Deserialize XML document似乎提供了最大的帮助,并且使用该示例我设法反序列化了根 cXML 标记,但这不适用于嵌套对象 PunchOutSetupRequest这是我真正需要反序列化的对象。

在向您展示代码墙之前,我的问题是如何正确地将这些对象反序列化为下面定义的 cXML 类而不更改 cXML.cs文件?由于这是一个标准,除非万不得已,否则我不想编辑它。我的代码是公平的游戏。预先感谢您提供任何帮助,因为我知道这个主题在 SO 中广泛涉及。

我有这个用于 cXML 的 XSD 文件,我使用了 xsd.exe转换为 C# 类的工具。我不会在此处粘贴整个架构以避免稀释问题,但您可以转到 cxml.org如果您需要更完整的图片。

我的 cXML 代码 它只是反序列化属性,不包含 cXML 中定义的 Header 或 Request 对象:

using (TextReader reader = new StringReader(text))
{
try
{
XmlRootAttribute xRoot = new XmlRootAttribute();
xRoot.ElementName = "cXML";
xRoot.IsNullable = true;
var serializer = new XmlSerializer(typeof(cXML), xRoot);
cxml = (cXML)serializer.Deserialize(reader);
}
catch (Exception ex)
{
string r = "";
}
}

我的代码 PunchOutSetupRequest反序列化。 尽管我设置了 xRoot,但当它看到 cXML 作为根节点时,它会抛出错误。元素到 PunchOutSetupRequest .
using (TextReader reader = new StringReader(text))
{
try
{
XmlRootAttribute xRoot = new XmlRootAttribute();
xRoot.ElementName = "PunchOutSetupRequest";
xRoot.IsNullable = true;
var serializer = new XmlSerializer(typeof(PunchOutSetupRequest), xRoot);
PunchOutSetupRequest request;
request = (PunchOutSetupRequest)serializer.Deserialize(reader);
}
catch (Exception ex)
{
string r = "";
}
}

文本变量值(数据已编辑):
<?xml version = '1.0' encoding = 'UTF-8'?>
<!DOCTYPE cXML SYSTEM "http://xml.cxml.org/schemas/cXML/1.1.007/cXML.dtd">
<cXML version="1.1.007" xml:lang="en-US" payloadID="" timestamp="2016-01- 04T03:21:32-05:00">
<Header>
<From>
<Credential domain="">
<Identity></Identity>
</Credential>
</From>
<To>
<Credential domain="">
<Identity></Identity>
</Credential>
</To>
<Sender>
<Credential domain="">
<Identity></Identity>
<SharedSecret></SharedSecret>
</Credential>
<UserAgent></UserAgent>
</Sender>
</Header>
<Request>
<PunchOutSetupRequest operation="create">
<BuyerCookie></BuyerCookie>
<Extrinsic name="User"></Extrinsic>
<BrowserFormPost>
<URL></URL>
</BrowserFormPost>
<Contact>
<Name xml:lang="en-US"></Name>
<Email></Email>
</Contact>
<SupplierSetup>
<URL></URL>
</SupplierSetup>
</PunchOutSetupRequest>
</Request>
</cXML>

cXML 类由 xsd.exe 生成(碎片)
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.33440")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true, Namespace = "http://tempuri.org/cXML")]
[System.Xml.Serialization.XmlRootAttribute(Namespace = "http://tempuri.org/cXML", IsNullable = false)]
public partial class cXML
{

private object[] itemsField;

private string versionField;

private string payloadIDField;

private string timestampField;

private string langField;

public cXML()
{
this.versionField = "1.1.010";
}

/// <remarks/>
[System.Xml.Serialization.XmlElementAttribute("Header", typeof(Header))]
[System.Xml.Serialization.XmlElementAttribute("Message", typeof(Message))]
[System.Xml.Serialization.XmlElementAttribute("Request", typeof(Request))]
[System.Xml.Serialization.XmlElementAttribute("Response", typeof(Response))]
public object[] Items
{
get
{
return this.itemsField;
}
set
{
this.itemsField = value;
}
}

/// <remarks/>
[System.Xml.Serialization.XmlAttributeAttribute()]
[System.ComponentModel.DefaultValueAttribute("1.1.010")]
public string version
{
get
{
return this.versionField;
}
set
{
this.versionField = value;
}
}

/// <remarks/>
[System.Xml.Serialization.XmlAttributeAttribute()]
public string payloadID
{
get
{
return this.payloadIDField;
}
set
{
this.payloadIDField = value;
}
}

/// <remarks/>
[System.Xml.Serialization.XmlAttributeAttribute()]
public string timestamp
{
get
{
return this.timestampField;
}
set
{
this.timestampField = value;
}
}

/// <remarks/>
[System.Xml.Serialization.XmlAttributeAttribute(Form = System.Xml.Schema.XmlSchemaForm.Qualified, Namespace = "http://www.w3.org/XML/1998/namespace")]
public string lang
{
get
{
return this.langField;
}
set
{
this.langField = value;
}
}
}

/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.33440")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true, Namespace = "http://tempuri.org/cXML")]
[System.Xml.Serialization.XmlRootAttribute(Namespace = "http://tempuri.org/cXML", IsNullable = false)]
public partial class PunchOutSetupRequest
{

private BuyerCookie buyerCookieField;

private Extrinsic[] extrinsicField;

private BrowserFormPost browserFormPostField;

private Contact[] contactField;

private SupplierSetup supplierSetupField;

private ShipTo shipToField;

private SelectedItem selectedItemField;

private ItemOut[] itemOutField;

private PunchOutSetupRequestOperation operationField;

/// <remarks/>
public BuyerCookie BuyerCookie
{
get
{
return this.buyerCookieField;
}
set
{
this.buyerCookieField = value;
}
}

/// <remarks/>
[System.Xml.Serialization.XmlElementAttribute("Extrinsic")]
public Extrinsic[] Extrinsic
{
get
{
return this.extrinsicField;
}
set
{
this.extrinsicField = value;
}
}

/// <remarks/>
public BrowserFormPost BrowserFormPost
{
get
{
return this.browserFormPostField;
}
set
{
this.browserFormPostField = value;
}
}

/// <remarks/>
[System.Xml.Serialization.XmlElementAttribute("Contact")]
public Contact[] Contact
{
get
{
return this.contactField;
}
set
{
this.contactField = value;
}
}

/// <remarks/>
public SupplierSetup SupplierSetup
{
get
{
return this.supplierSetupField;
}
set
{
this.supplierSetupField = value;
}
}

/// <remarks/>
public ShipTo ShipTo
{
get
{
return this.shipToField;
}
set
{
this.shipToField = value;
}
}

/// <remarks/>
public SelectedItem SelectedItem
{
get
{
return this.selectedItemField;
}
set
{
this.selectedItemField = value;
}
}

/// <remarks/>
[System.Xml.Serialization.XmlElementAttribute("ItemOut")]
public ItemOut[] ItemOut
{
get
{
return this.itemOutField;
}
set
{
this.itemOutField = value;
}
}

/// <remarks/>
[System.Xml.Serialization.XmlAttributeAttribute()]
public PunchOutSetupRequestOperation operation
{
get
{
return this.operationField;
}
set
{
this.operationField = value;
}
}
}

最佳答案

TL; 博士;
我通过在将 xsd 文件转换为 c# 模型之前编辑它来解决这个问题。

在从 DTD 生成的 XSD 中,更改:
<xs:schema xmlns="http://tempuri.org/cXML" xmlns:ds="uri:ds" elementFormDefault="qualified" targetNamespace="http://tempuri.org/cXML" xmlns:xs="http://www.w3.org/2001/XMLSchema">
到:
<xs:schema xmlns:ds="uri:ds" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
更长的解释:

如果在 DTD 文件上使用 Visual Studio 的 [XML]->[Create Schema],visual studio 将生成一个带有目标命名空间的 XSD http://tempuri.org/cXML .

如果您从该 XSD 生成 C# 模型而不删除这些命名空间引用(使用 xsd2code 或 Visual Studio 的 xsd blah.xsd /classes),则 XmlSerializer 将期望在您要反序列化的 XML 中使用该命名空间。

SAP Ariba 等平台不使用 tempuri.org 命名空间。因此将跳过 XML 节点,因为如果没有命名空间引用,则无法识别节点。我发现这是因为 XmlSerializer.UnknownNode 事件被触发,告诉我它无法识别诸如 Header 和 Request 之类的节点,并且它需要带有 tempuri.org 命名空间前缀的节点。

因此,如果您首先从 XSD 中删除伪造的命名空间,然后生成类(我为此使用了 xsd2code),那么您最终会得到有效的 c#(反)可序列化模型。

然后你也不需要使用 xRoot.ElementName = "cXML"; .它将从 c# 类中选取根节点,因为它不寻找 <cXML>带有 tempuri.org 命名空间的标记。

因此,通过这种方式,您不需要“消化”从 XSD 生成的类,您可以按原样使用它们。

关于c# - 将 cXML 反序列化为 C# 类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34620074/

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