2012-06-21 17 views
2

我有以下模式:DataSet支持GetXml方法时的复杂类型吗?

<?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()与复杂类型或我想念的东西。

任何指导,高度赞赏。

UPDATES1:

我使用DataSet.ReadXmlSchema( “... XSD”)。从那以后,我使用DataSet.Tables [..]创建DataTable来放置数据。然后调用DataSet.GetXml()来获取字符串XML表示。

UPDATES2:

代码:

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> 

OUTPUT:

<?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> 
+0

我会检查你的数据集连接WSParam与案例DataRelation对象。 –

+0

我看到ChildRelations数到1名为WSParam_Cases – bachie

+0

我也看到了DataSet.Relations。似乎是正确的。 – bachie

回答

0

我不确定是否可以使用数据集。

但是你可以通过创建一个非标准的微软数据集xsd来自己做。 它需要一点点工作,但你可以事后调整它,只要你喜欢。

关键是使用xs:group。

<?xml version="1.0" encoding="utf-8"?> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified"> 
    <xs:element name="NewDataSet"> 
    <xs:complexType> 
     <xs:sequence> 
     <xs:element name="WSParam"> 
      <xs:complexType> 
      <xs:sequence> 
       <xs:element name="domain" type="xs:string" minOccurs="0" /> 
       <xs:element name="userName" type="xs:string" minOccurs="0" /> 
       <xs:group ref="CasesGroup" minOccurs="0"/> 
      </xs:sequence> 
      </xs:complexType> 
     </xs:element> 
     </xs:sequence> 
    </xs:complexType> 
    </xs:element> 

    <xs:group name="CasesGroup"> 
    <xs:sequence> 
     <xs:element name="Cases"> 
     <xs:complexType> 
      <xs:sequence> 
      <xs:element name="CaseName" minOccurs="1" maxOccurs="unbounded"> 
       <xs:complexType> 
       <xs:simpleContent> 
        <xs:extension base="xs:string"> 
        </xs:extension> 
       </xs:simpleContent> 
       </xs:complexType> 
      </xs:element> 
      </xs:sequence> 
     </xs:complexType> 
     </xs:element> 
    </xs:sequence> 
    </xs:group> 
</xs:schema> 

对于上述XSD(我叫wsparam.xsd)运行 “XSD.EXE wsparam.xsd /班/ N:Yournamespace”

现在你可以从代码填充数据

NewDataSetWSParam p = new NewDataSetWSParam(); 
    p.domain = "ad"; 
    p.userName = "admin"; 
    p.Cases = new NewDataSetWSParamCaseName[] { 
      new NewDataSetWSParamCaseName() { Value ="case 1" } 
    }; 

现在到了棘手的部分 使用非标准的XmlTextWriter序列化剥离命名空间时从XML文件属性

public class NoNamespaceXmlWriter : XmlTextWriter 
{ 
      public NoNamespaceXmlWriter(System.IO.TextWriter output) 
       : base(output) 
      { 
       Formatting = System.Xml.Formatting.None; 
      } 

      public override void WriteStartDocument() { } 
      public override void WriteStartElement(string prefix, string localName, string ns) 
      { 
       base.WriteStartElement("", localName, ""); 
      } 
     } 

使用下面的代码,以序列化你反对

string serialXML = string.Empty; 
     XmlSerializerNamespaces ns = new XmlSerializerNamespaces(); 
     ns.Add("", ""); 

     XmlSerializer serializer = new XmlSerializer(p.GetType()); 
     StringBuilder sb = new StringBuilder(); 
     StringWriter sw = new StringWriter(sb); 
     using (XmlWriter writer = new RDECommon.Xml.NoNamespaceXmlWriter(sw)) 
     { 
      serializer.Serialize(writer, p, ns); 
      serialXML = sb.ToString(); 
     } 

serialXML包含你的XML

<NewDataSet> 
    <WSParam> 
     <domain>ad</domain> 
     <userName>admin</userName> 
     <Cases> 
      <caseName>case 1</caseName> 
     </Cases> 
    </WSParam> 
</NewDataSet> 
+0

这将工作,但马龙提到它需要定制。谢谢。被认为是答案。 – bachie