gpt4 book ai didi

c# - 使用 System.Xml.Serialization.XmlSerializer 反序列化有效 xml 文件的差异

转载 作者:行者123 更新时间:2023-11-30 22:42:52 27 4
gpt4 key购买 nike

一个相当复杂的问题,所以在此先感谢。以下两个 xml 文件均针对给定的模式进行验证,但在尝试使用 .Net 的 XmlSerializer 进行反序列化时,只有第一个文件正确执行:

<ex:iso_10303_28 xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.iai-tech.org/ifcXML/IFC2x3/FINAL" version="2.0" xmlns:ex="urn:iso.org:standard:10303:part(28):version(2):xmlschema:common">
<ex:iso_10303_28_header>
<ex:name>An Example</ex:name>
<ex:time_stamp>2010-11-12T13:04:00</ex:time_stamp>
<ex:author>John Hancock</ex:author>
<ex:organization>MegaCorp</ex:organization>
<ex:preprocessor_version>a preprocessor</ex:preprocessor_version>
<ex:originating_system>IfcXml dotNet Library</ex:originating_system>
<ex:authorization>none</ex:authorization>
<ex:documentation>documentation</ex:documentation>
</ex:iso_10303_28_header>
<ex:uos xsi:type="uos" id="uos_1" configuration="i-ifc2x3">
<ex:Entity xsi:type="IfcOrganization" id="i1101">
<Id xsi:nil="true" />
<Name>MegaCorp</Name>
<Description xsi:nil="true" />
<Roles xsi:nil="true" />
<Addresses xsi:nil="true" />
</ex:Entity>
<ex:Entity xsi:type="IfcCartesianPoint" id="i101">
<Coordinates ex:itemType="ifc:IfcLengthMeasure" ex:cType="list">
<IfcLengthMeasure>2500</IfcLengthMeasure>
<IfcLengthMeasure>0</IfcLengthMeasure>
<IfcLengthMeasure>0</IfcLengthMeasure>
</Coordinates>
</ex:Entity>
<ex:Entity xsi:type="IfcDirection" id="i102">
<DirectionRatios ex:itemType="ex:double-wrapper" ex:cType="list">
<ex:double-wrapper>0</ex:double-wrapper>
<ex:double-wrapper>1</ex:double-wrapper>
<ex:double-wrapper>0</ex:double-wrapper>
</DirectionRatios>
</ex:Entity>
</ex:uos>
</ex:iso_10303_28>

但是第二个文件反序列化不正确,在下面的(iso_10303_28.uos as uos1).Items中被反序列化为null:

<?xml version="1.0" encoding="UTF-8"?>
<ex:iso_10303_28
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:ex=
"urn:iso.org:standard:10303:part(28):version(2):xmlschema:common"
xmlns="http://www.iai-tech.org/ifcXML/IFC2x3/FINAL"
xsi:schemaLocation="http://www.iai-tech.org/ifcXML/IFC2x3/FINAL
http://www.iai-tech.org/ifcXML/IFC2x3/FINAL/IFC2x3.xsd"
version="2.0">
<ex:iso_10303_28_header>
<ex:name>An Example</ex:name>
<ex:time_stamp>2010-11-12T13:04:00</ex:time_stamp>
<ex:author>John Hancock</ex:author>
<ex:organization>MegaCorp</ex:organization>
<ex:preprocessor_version>a preprocessor</ex:preprocessor_version>
<ex:originating_system>IfcXml dotNet Library</ex:originating_system>
<ex:authorization>none</ex:authorization>
<ex:documentation>documentation</ex:documentation>
</ex:iso_10303_28_header>
<uos id="uos_1" description="" configuration="i-ifc2x3" edo="">
<IfcOrganization id="i1101">
<Name>MegaCorp</Name>
</IfcOrganization>
<IfcCartesianPoint id="i101">
<Coordinates>
<IfcLengthMeasure>2500.0</IfcLengthMeasure>
<IfcLengthMeasure>0.0</IfcLengthMeasure>
<IfcLengthMeasure>0.0</IfcLengthMeasure>
</Coordinates>
</IfcCartesianPoint>
<IfcDirection id="i102">
<DirectionRatios>
<ex:double-wrapper>0.</ex:double-wrapper>
<ex:double-wrapper>1.</ex:double-wrapper>
<ex:double-wrapper>0.</ex:double-wrapper>
</DirectionRatios>
</IfcDirection>
</uos>
</ex:iso_10303_28>

我的反序列化器本质上是:

iso_10303_28 deserialized = (iso_10303_28)serializer.Deserialize( reader );

//using NUnit
Assert.IsNotNull(deserialized);
Assert.IsNotNull(deserialized.uos);
uos1 uos1 = deserialized.uos as uos1;
Assert.IsNotNull(uos1);
Assert.IsNotNull(uos1.Items); //<---FAILS HERE
Assert.AreEqual(3, uos1.Items.length);

uos 类是:

[System.Xml.Serialization.XmlTypeAttribute(TypeName="uos", Namespace="http://www.iai-tech.org/ifcXML/IFC2x3/FINAL")]
[System.Xml.Serialization.XmlRootAttribute("uos", Namespace="http://www.iai-tech.org/ifcXML/IFC2x3/FINAL", IsNullable=false)]
public partial class uos1 : uos {

private Entity[] itemsField;

/// <remarks/>
[System.Xml.Serialization.XmlElementAttribute("Entity", Namespace="urn:iso.org:standard:10303:part(28):version(2):xmlschema:common")]
public Entity[] Items {
get {
return this.itemsField;
}
set {
this.itemsField = value;
}
}
}

[System.Xml.Serialization.XmlIncludeAttribute(typeof(uos1))]
[System.Xml.Serialization.XmlTypeAttribute( Namespace="urn:iso.org:standard:10303:part(28):version(2):xmlschema:common")]
public partial class uos {

private string idField;

private string[] expressField;

private string[] configurationField;

private string[] schemaLocationField;

private string edoField;

private string descriptionField;

/// <remarks/>
[System.Xml.Serialization.XmlAttributeAttribute(DataType="ID")]
public string id {
get {
return this.idField;
}
set {
this.idField = value;
}
}

/// <remarks/>
[System.Xml.Serialization.XmlAttributeAttribute(DataType="anyURI")]
public string[] express {
get {
return this.expressField;
}
set {
this.expressField = value;
}
}

/// <remarks/>
[System.Xml.Serialization.XmlAttributeAttribute(DataType="anyURI")]
public string[] configuration {
get {
return this.configurationField;
}
set {
this.configurationField = value;
}
}

/// <remarks/>
[System.Xml.Serialization.XmlAttributeAttribute(DataType="anyURI")]
public string[] schemaLocation {
get {
return this.schemaLocationField;
}
set {
this.schemaLocationField = value;
}
}

/// <remarks/>
[System.Xml.Serialization.XmlAttributeAttribute(DataType="anyURI")]
public string edo {
get {
return this.edoField;
}
set {
this.edoField = value;
}
}

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

iso_10303_28 的类如下:

[System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true, Namespace="urn:iso.org:standard:10303:part(28):version(2):xmlschema:common")]
[System.Xml.Serialization.XmlRootAttribute(Namespace="urn:iso.org:standard:10303:part(28):version(2):xmlschema:common", IsNullable=false)]
public partial class iso_10303_28 {

private iso_10303_28_header iso_10303_28_headerField;

private uos uosField;

private string versionField;

/// <remarks/>
public iso_10303_28_header iso_10303_28_header {
get {
return this.iso_10303_28_headerField;
}
set {
this.iso_10303_28_headerField = value;
}
}

public enum uosChoice
{
[XmlEnum("http://www.iai-tech.org/ifcXML/IFC2x3/FINAL:uos")]
uos1,
[XmlEnum("urn:iso.org:standard:10303:part(28):version(2):xmlschema:common:uos")]
uos
}

[XmlIgnore()]
public uosChoice uosChoiceField;

[XmlChoiceIdentifier("uosChoiceField")]
[XmlElement(ElementName = "uos", Namespace = "http://www.iai-tech.org/ifcXML/IFC2x3/FINAL", Type = typeof(uos1))]
[XmlElement(ElementName = "uos", Namespace = "urn:iso.org:standard:10303:part(28):version(2):xmlschema:common")]
public uos uos {
get {
return this.uosField;
}
set {
this.uosField = value;
}
}

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

有没有人遇到过这个问题?是否有一个原因?我错过了什么吗?有修复或解决方法吗?

由于模式和代码的其余部分相当大,并且试图将它们简化为最少的失败部分会导致更多问题(请参阅 this question)我没有将它们粘贴到此处。但是,如果需要,可以在 http://code.google.com/p/ifc-dotnet/ 找到此问题的模式、单元测试和源代码。

最佳答案

这两个 XML 文件不一样,在文件 1 中,us 在 ex 下是合格的,所以它在 "urn:iso.org:standard:10303:part(28):version(2):xmlschema:common "命名空间,而在第二个中它不是并且在默认命名空间下。

在 uos 类型的类“iso_10303_28”属性 uos 中,这意味着 XmlSerializer 将期望名称为“uos”的元素(默认情况下)在与类描述的 iso_10303_28 和“xsi:type”“uos”相同的命名空间下'uos' - 在相同的 - “urn:iso.org:standard:10303:part(28):version(2):xmlschema:common”命名空间下。所以这解释了为什么你在第二个 xml 中得到 null。如果您无法控制 xml - 并且您应该能够反序列化其中任何一个,请尝试以下操作

  1. 除非由 XmlInclude 属性指定,否则类型 uos 不知道类型 uos1。我认为您在 uos 类上另外添加了一个 XmlInclude 属性以将 uos1 包含为已知类型。如果不是 - 序列化器将不会反序列化第一个文件。如果不是 - 你应该按照下面的方式做

    [System.Xml.Serialization.XmlInclude(typeof(uos1))] [System.Xml.Serialization.XmlTypeAttribute(Namespace = "urn:iso.org:standard:10303:part(28):version(2):xmlschema:common")] 公共(public)部分类 uos {

    }
  2. 您可以为属性 iso_10303_28.uos 添加 XmlElement 属性以接受任一命名空间下的名称 - 并使用选择标识符或使用“uos[]”而不是“uos”作为类型。使用选择标识符 - 它可以完成为

[System.Xml.Serialization.XmlRootAttribute(Namespace = "urn:iso.org:standard:10303:part(28):version(2):xmlschema:common", IsNullable = false)] 公共(public)部分类 iso_10303_28 { 私有(private) uos uosField;

    public enum uosChoice
{
[XmlEnum("http://www.iai-tech.org/ifcXML/IFC2x3/FINAL:uos")]
uos,
[XmlEnum("urn:iso.org:standard:10303:part(28):version(2):xmlschema:common:uos")]
uos1
}

[XmlIgnore]
public uosChoice uosChoiceField;

[XmlChoiceIdentifier("uosChoiceField")]
[XmlElement(ElementName = "uos", Namespace = "http://www.iai-tech.org/ifcXML/IFC2x3/FINAL", Type = typeof(uos1))]
[XmlElement(ElementName = "uos", Namespace = "urn:iso.org:standard:10303:part(28):version(2):xmlschema:common")]
public uos uos
{
get
{
return this.uosField;
}
set
{
this.uosField = value;
}
}


}

编辑:要正确解析 Items,请像这样修改 uos1

 [System.Xml.Serialization.XmlTypeAttribute(TypeName = "uos", Namespace = "http://www.iai-tech.org/ifcXML/IFC2x3/FINAL")]
[System.Xml.Serialization.XmlRootAttribute("uos", Namespace = "http://www.iai-tech.org/ifcXML/IFC2x3/FINAL", IsNullable = false)]
public partial class uos1 : uos
{
private Entity[] itemsField;

/// <remarks/>
[XmlElement(ElementName = "Entity", Namespace = "urn:iso.org:standard:10303:part(28):version(2):xmlschema:common", Type = typeof(Entity))]
[XmlElement(ElementName = "IfcOrganization", Namespace = "http://www.iai-tech.org/ifcXML/IFC2x3/FINAL", Type = typeof(IfcOrganization))]
[XmlElement(ElementName = "IfcCartesianPoint", Namespace = "http://www.iai-tech.org/ifcXML/IFC2x3/FINAL", Type = typeof(IfcCartesianPoint))]
[XmlElement(ElementName = "IfcDirection", Namespace = "http://www.iai-tech.org/ifcXML/IFC2x3/FINAL", Type = typeof(IfcDirection))]
public Entity[] Items
{
get
{
return this.itemsField;
}
set
{
this.itemsField = value;
}
}

}

[System.Xml.Serialization.XmlTypeAttribute(TypeName = "IfcOrganization", Namespace = "http://www.iai-tech.org/ifcXML/IFC2x3/FINAL")]
public class IfcOrganization : Entity
{

}

[System.Xml.Serialization.XmlTypeAttribute(TypeName = "IfcCartesianPoint", Namespace = "http://www.iai-tech.org/ifcXML/IFC2x3/FINAL")]
public class IfcCartesianPoint : Entity
{

}

[System.Xml.Serialization.XmlTypeAttribute(TypeName = "IfcDirection", Namespace = "http://www.iai-tech.org/ifcXML/IFC2x3/FINAL")]
public class IfcDirection : Entity
{

}

[XmlInclude(typeof(IfcOrganization))]
[XmlInclude(typeof(IfcCartesianPoint))]
[XmlInclude(typeof(IfcDirection))]
[System.Xml.Serialization.XmlTypeAttribute(TypeName = "Entity", Namespace = "urn:iso.org:standard:10303:part(28):version(2):xmlschema:common")]
public class Entity
{

}

关于c# - 使用 System.Xml.Serialization.XmlSerializer 反序列化有效 xml 文件的差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4179086/

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