【发布时间】:2012-06-23 05:47:17
【问题描述】:
我有以下架构:
<?xml version="1.0" encoding="utf-8" ?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
<xs:element name="WSParam">
<xs:complexType>
<xs:sequence>
<xs:element name="domain" type="xs:string"/>
<xs:element name="userName" type="xs:string"/>
<xs:element name="Cases">
<xs:complexType>
<xs:sequence>
<xs:element name="caseName" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
我期望 DataSet.GetXml() 的输出如下:
<NewDataSet>
<WSParam>
<domain>ad</domain>
<userName>admin</userName>
<Cases>
<caseName>case 1</caseName>
</Cases>
</WSParam>
</NewDataSet>
但是输出是:
<NewDataSet>
<WSParam>
<domain>ad</domain>
<userName>admin</userName>
</WSParam>
<Cases>
<caseName>case 1</caseName>
</Cases>
</NewDataSet>
任何人都可以向我确认具有复杂类型的 DataSet.GetXml() 的正确行为,否则我会遗漏一些东西。
非常感谢任何指导。
更新1:
我正在使用 DataSet.ReadXmlSchema("...xsd")。由此,我使用 DataSet.Tables[..] 创建 DataTable 来放置数据。然后调用 DataSet.GetXml() 获取字符串 XML 表示。
更新2:
代码:
private void button2_Click(object sender, EventArgs e)
{
String sXSD = @"C:\WindowsFormsApplication1\WindowsFormsApplication1\XMLFile1.xsd";
DataSet dsXSD = new DataSet();
dsXSD.ReadXmlSchema(sXSD);
int k = 0;
do
{
DataRow d;
d = dsXSD.Tables["tblUser"].NewRow();
int i = 0;
do
{
d[i] = k;
i = (i + 1);
} while (i < dsXSD.Tables["tblUser"].Columns.Count);
dsXSD.Tables["tblUser"].Rows.Add(d);
d = dsXSD.Tables["tblUserRole"].NewRow();
i = 0;
do
{
d[i] = k;
i = (i + 1);
} while (i < dsXSD.Tables["tblUserRole"].Columns.Count);
dsXSD.Tables["tblUserRole"].Rows.Add(d);
k = (k + 1);
} while (k < 3);
dsXSD.WriteXml("c:\\test.xml");
}
XSD:
<?xml version="1.0" encoding="utf-16" ?>
<xsd:schema attributeFormDefault="unqualified" elementFormDefault="qualified" version="1.0"
xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:element name="tblUser">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="UserID" type="xsd:int" />
<xsd:element name="FullName" type="xsd:string" nillable="true" />
<xsd:element name="tblUserRole">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="UserID" type="xsd:int" />
<xsd:element name="RoleID" type="xsd:int" />
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:schema>
输出:
<?xml version="1.0" standalone="yes"?>
<NewDataSet>
<tblUser>
<UserID>0</UserID>
<FullName>0</FullName>
<tblUserRole>
<UserID>0</UserID>
<RoleID>0</RoleID>
</tblUserRole>
</tblUser>
<tblUser>
<UserID>1</UserID>
<FullName>1</FullName>
<tblUserRole>
<UserID>1</UserID>
<RoleID>1</RoleID>
</tblUserRole>
</tblUser>
<tblUser>
<UserID>2</UserID>
<FullName>2</FullName>
<tblUserRole>
<UserID>2</UserID>
<RoleID>2</RoleID>
</tblUserRole>
</tblUser>
</NewDataSet>
【问题讨论】:
-
我会检查您的 DataSet 是否有连接 WSParam 和 Cases 的 DataRelation 对象。
-
我看到 ChildRelations 计数为 1,名为 WSParam_Cases
-
我还看到了 DataSet.Relations。似乎是正确的。
-
据我所知,您的 complexTypes 将是它们自己的表。这两个表之间有某种关系,很可能表明 Cases 是 WSParam 的子级,但我不知道它们将如何映射。
-
我在网上看到了一个关于如何基于 xsd 生成结构化 xml 的 sn-p。请允许我更新我的帖子,包括它。解决方案很奇怪,因为我做的相同但输出不同。我可以请任何人解释它是如何工作的。
标签: c# xml dataset strongly-typed-dataset