【发布时间】:2009-07-08 06:33:10
【问题描述】:
我的困惑是,我正在使用 .Net C# XMLSerializer 序列化自定义定义的类型,使用 XSD 工具从输入的原始 XML 文件生成的 schema/cs 文件。但生成的序列化 XML 文件命名空间与原始 XML 输入文件不同。尤其是从原始的 XML 文件中,Envelope 属于命名空间 soapenv,但在序列化的 XML 文件中,Envelope 属于默认命名空间。有什么想法有什么问题吗?
这是我如何使用 XSD 工具从 XML 输入文件 XMLFile1.xml 为自定义定义类型生成模式文件和 cs 文件,
顺便说一句:XML 文件可以从那里下载,
http://www.mediafire.com/?nwngwzz3gmm
D:\>xsd XMLFile1.xml
Microsoft (R) Xml Schemas/DataTypes support utility
[Microsoft (R) .NET Framework, Version 2.0.50727.3038]
Copyright (C) Microsoft Corporation. All rights reserved.
Writing file 'D:\XMLFile1.xsd'.
D:\>xsd XMLFile1.xsd XMLFile1_app1.xsd /classes
Microsoft (R) Xml Schemas/DataTypes support utility
[Microsoft (R) .NET Framework, Version 2.0.50727.3038]
Copyright (C) Microsoft Corporation. All rights reserved.
Writing file 'D:\XMLFile1_XMLFile1_app1.cs'.
这是我如何使用 C# 代码序列化文件并输出到 TestOutputFile.xml,
static void Main(string[] args)
{
Envelope en = new Envelope();
en.Items = new EnvelopeBody[1];
en.Items[0] = new EnvelopeBody();
en.Items[0].QueryResponse = new QueryResponseFaculties[1];
en.Items[0].QueryResponse[0] = new QueryResponseFaculties();
en.Items[0].QueryResponse[0].Name = "John";
XmlSerializer serializer =
new XmlSerializer(typeof(Envelope));
TextWriter writer = new StreamWriter("TestOutputFile.xml");
serializer.Serialize(writer, en);
writer.Close();
return;
}
原始的 XML 文件是,
<?xml version="1.0" encoding="utf-8"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
<soapenv:Body>
<QueryResponse xmlns="http://schemas.mycorp.com/test">
<Faculties>
<Name>
John
</Name>
</Faculties>
</QueryResponse>
</soapenv:Body>
</soapenv:Envelope>
序列化的 XML 文件是,
<?xml version="1.0" encoding="utf-8"?>
<Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns="http://schemas.xmlsoap.org/soap/envelope/">
<Body>
<QueryResponse xmlns="http://schemas.mycorp.com/test">
<Faculties>
<Name>John</Name>
</Faculties>
</QueryResponse>
</Body>
</Envelope>
编辑 1:
当前代码是,
static void Main(string[] args)
{
XmlSerializerNamespaces ns = new XmlSerializerNamespaces();
ns.Add("soapenv", "http://schemas.xmlsoap.org/soap/envelope/");
ns.Add("", "http://schemas.mycorp.com/test");
ns.Add("xsd", "http://www.w3.org/2001/XMLSchema");
ns.Add("xsi", "http://www.w3.org/2001/XMLSchema-instance");
Envelope en = new Envelope();
en.Items = new EnvelopeBody[1];
en.Items[0] = new EnvelopeBody();
en.Items[0].QueryResponse = new QueryResponseFaculties[1];
en.Items[0].QueryResponse[0] = new QueryResponseFaculties();
en.Items[0].QueryResponse[0].Name = "John";
XmlSerializer serializer =
new XmlSerializer(typeof(Envelope));
TextWriter writer = new StreamWriter("TestOutputFile.xml");
serializer.Serialize(writer, en, ns);
writer.Close();
return;
}
当前输出(序列化的 XML 文件)是,
<?xml version="1.0" encoding="utf-8"?>
<soapenv:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://schemas.mycorp.com/test"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
<soapenv:Body>
<QueryResponse>
<Faculties>
<Name>John</Name>
</Faculties>
</QueryResponse>
</soapenv:Body>
</soapenv:Envelope>
我希望输出是(注意字符串 xmlns="http://schemas.mycorp.com/test" 的位置),
<?xml version="1.0" encoding="utf-8"?>
<soapenv:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
<soapenv:Body>
<QueryResponse xmlns="http://schemas.mycorp.com/test">
<Faculties>
<Name>John</Name>
</Faculties>
</QueryResponse>
</soapenv:Body>
</soapenv:Envelope>
提前致谢, 乔治
【问题讨论】:
-
更新了我的示例以显示它可以使用完整代码
-
您一直说命名空间位于错误的位置,但是当我运行代码时,我发布的输出完全符合您的要求。我想知道这是否是框架版本的东西;我在 3.5SP1
-
George,您的部分问题是您正在序列化信封和内容。你为什么这样做?你没有调用网络服务吗?
标签: c# .net xml-serialization