gpt4 book ai didi

c# - xmlserializer 没有正确反序列化模式与导入

转载 作者:太空宇宙 更新时间:2023-11-03 16:55:37 24 4
gpt4 key购买 nike

我一直在尝试使用从 xsd.exe 中的模式生成的类反序列化 C# 中的 xml 文件。不幸的是,只有部分文件被正确反序列化,其余部分由于我无法解决的原因返回为 null。

我的流程如下:从生成 C# 代码的 myschema.xsd 文件开始:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:mc="myschema:common" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:ttl="http://www.myuri.org/myschema" targetNamespace="http://www.myuri.org/myschema" elementFormDefault="qualified" attributeFormDefault="unqualified">

导入的parentschema.xsd文件是这样的:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:mc="myschema:common" xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="myschema:common" elementFormDefault="qualified" attributeFormDefault="unqualified">
<xs:element name="toplevel">
<xs:complexType>
<xs:sequence>
<xs:element ref="mc:toplevel_header" minOccurs="0"/>
<xs:element ref="mc:body"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="toplevel_header">
<xs:complexType>
<xs:sequence>
<xs:element name="name" type="xs:anyURI"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="body" type="mc:body" abstract="true"/>
<xs:complexType name="body">
<xs:attribute name="id" type="xs:ID" use="required"/>
</xs:complexType>
<xs:element name="Entity" type="mc:Entity" abstract="true"/>
<xs:complexType name="Entity" abstract="true">
<xs:attribute name="href" type="xs:anyURI" use="optional"/>
</xs:complexType>
</xs:schema>

我将上述两个模式文件传递给 xsd.exe:

>xsd.exe /c myschema.xsd parentschema.xsd

生成一个 myschema_parentschema.cs 文件

为了测试它,我正在尝试反序列化示例 xml 文件:

<?xml version=\"1.0\" encoding="UTF-8"?>
<toplevel version="2.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns="myschema:common"
xsi:schemaLocation="myschema:common http://www.myuri.org/parentschema.xsd">
<toplevel_header>
<name>MyName</name>
</toplevel_header>
<body id="body_1"
xmlns="http://www.myuri.org/schema"
xmlns:mc="myschema:common"
xsi:schemaLocation="http://www.myuri.org/myschema http://www.myuri.org/myschema.xsd">
<Foo href="http://www.google.com">
</Foo>
</body>
</toplevel>

我将其传递给以下 XmlSerializer 代码,其中 reader 是上述 xml 文件的 XmlReader:

XmlSerializer xs = new XmlSerializer ( typeof ( toplevel ) );
object deserializedObject = xs.Deserialize( reader );
toplevel fooBar = (toplevel)deserializedObject;
Assert.AreEqual( "MyName", fooBar.toplevel_header.name ); //passes OK
Assert.IsNotNull( fooBar.body ); //<--------FAIL

为什么反序列化的对象有一个 null body 属性,我如何才能正确地反序列化 Foo 元素?

最佳答案

您的 parentschema.xsd 中有错字。您正在关闭 <xs:element>为 body 标记过早标记:

<xs:element name="body" type="mc:body" abstract="true"/>

您还将正文定义为抽象的,我认为这是一个错误(如果我正确阅读 XML)。

整个定义(基于您的 XML)应该类似于:

<xs:element name="body" type="mc:body" abstract="true">
<xs:complexType>
<xs:attribute name="id" type="xs:ID" use="required"/>
<xs:sequence>
<xs:element type="Foo" type="xs:anyURI" />
</xs:sequence>
</xs:complexType>
</xs:element>

关于c# - xmlserializer 没有正确反序列化模式与导入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2150055/

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