2

私は以下のスキーマを持っています:

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

1 に答える 1

0

データセットを使用してそれが可能かどうかはわかりません。

ただし、非標準のMicrosoftデータセット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 / classes / n:Yournamespace」を実行します。

これで、コードからデータを入力できます

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

XMLファイルから名前空間属性を削除するためにシリアル化するときに非標準のXmlTextWriterを使用するというトリッキーな部分があります

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>
于 2013-07-04T06:46:47.597 に答える