2012-06-21 1 views
2

J'ai le schéma ci-dessous:Est-ce que DataSet prend en charge le type complexe lors de la méthode 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> 

J'attendais la sortie DataSet.GetXml() ci-dessous:

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

Mais la sortie est:

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

quelqu'un me confirmer la comportement correct de DataSet.GetXml() avec un type complexe ou quelque chose me manque.

Toute indication est fortement appréciée.

UPDATES1:

J'utilise DataSet.ReadXmlSchema ("... xsd"). De cela, j'utilise DataSet.Tables [..] pour créer DataTable pour mettre les données. Appelez ensuite DataSet.GetXml() pour obtenir la représentation XML de la chaîne.

UPDATES2:

code:

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> 

SORTIE:

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

Je voudrais vérifier votre DataSet pour les objets DataRelation qui relient WSParam et les affaires. –

+0

J'ai vu ChildRelations compter à 1 nommé WSParam_Cases – bachie

+0

J'ai vu aussi DataSet.Relations. Cela semble correct. – bachie

Répondre

0

Je ne sais pas si c'est possible en utilisant des jeux de données.

Mais vous pouvez le faire vous-même en créant un jeu de données xsd non standard Microsoft. Cela demande un peu de travail, mais vous pouvez ensuite le modifier comme bon vous semble.

La clé consiste à utiliser un groupe xs :.

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

Pour le xsd ci-dessus (que j'ai appelé wsparam.xsd) run "XSD.exe wsparam.xsd/classes/n: Yournamespace"

Maintenant, vous pouvez remplir les données à partir du code

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

maintenant vient la partie la plus délicate l'utilisation d'un XmlTextWriter non standard lors de la sérialisation à bande namespace attributs du fichier 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, ""); 
      } 
     } 

Utilisez le code ci-dessous pour vous sérialiser l'objet

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 contient votre xml

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

Cela fonctionnerait mais comme Marlon a mentionné qu'il nécessite une personnalisation. Merci. Considéré comme la réponse. – bachie

Questions connexes