gpt4 book ai didi

c# - 创建符合 XSD 架构的 XML 文档的最佳方法是什么?

转载 作者:数据小太阳 更新时间:2023-10-29 02:17:00 26 4
gpt4 key购买 nike

我有一个 XSD,我必须生成一个 XML 文档以发送给我合作公司的客户。我发送的文档将根据此 XSD 架构进行验证。

创建符合 XSD 架构的 XML 文档的最佳方法是什么?我的意思是,我正在寻找最佳实践等。我是新手,在四处“谷歌搜索”时,我发现有人在使用 XmlTextWriter、DataSet.WriteXml 等。

  1. DataSet.WriteXml 似乎不适合我。这就是我所做的:

    var ds = new DataSet();
    ds.ReadXmlSchema(schemaFile);
    ds.Tables["TableName"].Rows.Add("", "", 78, true, DateTime.Now);
    ...
    ds.WriteXml("C:\\xml.xml");

    我发现它生成了一个带有 NewDataSet 的节点,而且这些节点的顺序不正确。

  2. XmlTextWriter,我觉得做起来有点长......但如果没有其他选择,我会的。

您认为最好的方法是什么?还有其他方法吗?如果它不是那么长并且与问题相关,我会把它放在这里。

最佳答案

.NET中的主流做法是使用XML Serialization .

在你的情况下,我会这样做:

  • 也在 .XSD 上运行 xsd.exe 以生成类的源代码 (xsd/c)
  • 构建您的应用程序以利用这些生成的类。请记住,您可以通过“部分类”技术扩展这些类
  • 在代码中,实例化一个 XmlSerializer,并序列化类实例。

示例:

鉴于此模式:

<xs:schema elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="Foo" nillable="true" type="Foo" />
<xs:complexType name="Foo">
<xs:sequence>
<xs:element minOccurs="0" maxOccurs="1" name="Bar" type="xs:string" />
<xs:element minOccurs="0" maxOccurs="1" name="Baz" type="UntypedArray" />
</xs:sequence>
</xs:complexType>


<xs:complexType name="UntypedArray">
<xs:choice minOccurs="1" maxOccurs="unbounded">
<xs:element name="Type1" type="Type1" minOccurs="1" maxOccurs="1"/>
<xs:any namespace="##other" processContents="lax" minOccurs="1" maxOccurs="1"/>
</xs:choice>
</xs:complexType>


<xs:complexType name="Type1" mixed="true">
<xs:sequence>
<xs:element minOccurs="0" maxOccurs="1" name="Child" type="xs:string" />
</xs:sequence>
</xs:complexType>
</xs:schema>

xsd.exe 生成此源代码:

[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "2.0.50727.42")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlRootAttribute(Namespace="", IsNullable=true)]
public partial class Foo {

private string barField;

private object[] bazField;

/// <remarks/>
public string Bar {
get {
return this.barField;
}
set {
this.barField = value;
}
}

/// <remarks/>
[System.Xml.Serialization.XmlArrayItemAttribute("", typeof(System.Xml.XmlElement), IsNullable=false)]
[System.Xml.Serialization.XmlArrayItemAttribute(typeof(Type1), IsNullable=false)]
public object[] Baz {
get {
return this.bazField;
}
set {
this.bazField = value;
}
}
}

/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "2.0.50727.42")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
public partial class Type1 {

private string childField;

private string[] textField;

/// <remarks/>
public string Child {
get {
return this.childField;
}
set {
this.childField = value;
}
}

/// <remarks/>
[System.Xml.Serialization.XmlTextAttribute()]
public string[] Text {
get {
return this.textField;
}
set {
this.textField = value;
}
}
}

在您的应用中,您可以实例化一个 Foo 然后序列化,如下所示:

    Foo foo = new Foo();
// ...populate foo here...
var builder = new System.Text.StringBuilder();
XmlSerializer s = new XmlSerializer(typeof(Foo));
using ( var writer = System.Xml.XmlWriter.Create(builder))
{
s.Serialize(writer, foo, ns);
}
string rawXml = builder.ToString();

这个例子序列化为一个字符串。当然,您可以序列化到其他 XmlWriter,可以写出到文件、任意流等。

通常我会调整序列化以省略 XML 声明、省略默认的 xml namespace 等。像这样:

    Foo foo = new Foo();
// ...populate foo here...
var builder = new System.Text.StringBuilder();
var settings = new System.Xml.XmlWriterSettings { OmitXmlDeclaration = true, Indent= true };
var ns = new XmlSerializerNamespaces();
ns.Add("","");
XmlSerializer s = new XmlSerializer(typeof(Foo));
using ( var writer = System.Xml.XmlWriter.Create(builder, settings))
{
s.Serialize(writer, foo, ns);
}
string rawXml = builder.ToString();

您也可以执行相反的操作 - 使用 XmlSerializer 从 XML 文档映射到内存中的对象图。使用反序列化方法。

关于c# - 创建符合 XSD 架构的 XML 文档的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1015054/

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