使用 XSD 将数据从数据 Table 导出到 XML 文件

Exporting Data from a Data Table to a XML-File using XSD

我正在尝试使用我的 XSD 将我的数据从数据 Table 导出到 XML-文件。因为我有另一个导入数据的函数,所以我希望导出看起来一样,所以我从我的 Import-XML-File.

中生成了一个 XSD

导出数据的函数是:

public void Export(string CmdString)
    {
            cmd = new SqlCommand(CmdString, SqlConnector.conn);
            dt = new DataTable("tbl_Adresse");
            sda = new SqlDataAdapter(cmd);
            sda.Fill(dt);
            dt.WriteXml("..\..\..\XmlDataHandler\XMLFile_Export.xml", XmlWriteMode.WriteSchema);
    }

导入-XML-文件如下所示:

<?xml version="1.0" encoding="ISO-8859-1"?>

<tbl_address>
 <row delete="true" />
 <row Forename="Simon" Surname="Baker" MobileNr="+193434278" />
 <row Forename="Johnny" Surname="Depp" MobileNr="+173953278" />
 <row Forename="Michael" Surname="Jackson" MobileNr="+127425978" />
 <row Forename="Elvis" Surname="Prasley" MobileNr="+163645378" />
 <row Forename="Axl" Surname="Rose" MobileNr="+173975618" />
</tbl_address>

架构如下所示:

<?xml version="1.0" encoding="utf-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">

<xs:element name="tbl_address">
 <xs:complexType>
  <xs:sequence>
    <xs:element name="row" maxOccurs="unbounded">
     <xs:complexType>
      <xs:attribute name="delete" type="xs:string"></xs:attribute>
     </xs:complexType>
    </xs:element>
   </xs:sequence>
  </xs:complexType>
 </xs:element>
</xs:schema>

目前导出-XML-文件如下所示:

<?xml version="1.0" standalone="yes"?>
<NewDataSet>
<xs:schema id="NewDataSet" xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xs:element name="NewDataSet" msdata:IsDataSet="true" msdata:MainDataTable="tbl_address" msdata:UseCurrentLocale="true">
  <xs:complexType>
    <xs:choice minOccurs="0" maxOccurs="unbounded">
      <xs:element name="tbl_address">
        <xs:complexType>
          <xs:sequence>
            <xs:element name="Forename" type="xs:string" minOccurs="0" />
            <xs:element name="Surname" type="xs:string" minOccurs="0" />
            <xs:element name="MobileNr" type="xs:string" minOccurs="0" />
          </xs:sequence>
        </xs:complexType>
      </xs:element>
    </xs:choice>
  </xs:complexType>
</xs:element>
</xs:schema>

 <tbl_address>
  <Forename>Simon</Forename>
  <Surname>Baker</Surname>
  <MobileNr>+193434278</MobileNr>
 </tbl_address
 <tbl_address>
  <Forename>Johny</Forename>
  <Surname>Depp</Surname>
  <MobileNr>+173953278</MobileNr>
 </tbl_address
 <tbl_address>
  <Forename>Michael</Forename>
  <Surname>Jackson</Surname>
  <MobileNr>+127425978</MobileNr>
 </tbl_address
 <tbl_address>
  <Forename>Elvis</Forename>
  <Surname>Prasley</Surname>
  <MobileNr>+163645378</MobileNr>
 </tbl_address
 <tbl_address>
  <Forename>Axl</Forename>
  <Surname>Rose</Surname>
  <MobileNr>+173975618</MobileNr>
 </tbl_address
</NewDataSet>

我必须更改什么才能使导出文件看起来与导入文件相同?

向 DataTable 添加架构

            DataTable dt = new DataTable("tbl_Adresse");
            dt.ReadXmlSchema(fileName);
            sda = new SqlDataAdapter(cmd);
            sda.Fill(dt);
​

除了向您的 DataTable 对象添加模式(如其他答案所述),我相信您的模式本身需要调整。

我使用 XSD 来解释您的输入 XML(作为示例)并将其转换为 XSD 模式表示。下面的架构是 XSD 返回的内容:

<?xml version="1.0" encoding="utf-8"?>
<xs:schema id="tbl_address" xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
  <xs:element name="tbl_address" msdata:IsDataSet="true" msdata:UseCurrentLocale="true">
    <xs:complexType>
      <xs:choice minOccurs="0" maxOccurs="unbounded">
        <xs:element name="row">
          <xs:complexType>
            <xs:attribute name="delete" type="xs:string" />
            <xs:attribute name="Forename" type="xs:string" />
            <xs:attribute name="Surname" type="xs:string" />
            <xs:attribute name="MobileNr" type="xs:string" />
          </xs:complexType>
        </xs:element>
      </xs:choice>
    </xs:complexType>
  </xs:element>
</xs:schema>

请注意,它与您发布的架构略有不同。请尝试按照建议进行两项调整(将架构添加到 DataTable 对象并修改架构以更接近数据匹配)并报告回来!

我现在解决了

导出函数如下所示:

public void Export(string CmdString)
    {
        cmd = new SqlCommand(CmdString, SqlConnector.conn);
        da = new SqlDataAdapter(cmd);
        dt = new DataTable("row");
        ds = new DataSet("tbl_adress");
        dt.ReadXmlSchema("..\..\..\XmlDataHandler\XmlSchema.xsd");
        SqlConnector.da.Fill(dt);
        ds.Tables.Add(dt);
        ds.WriteXml("..\..\..\XmlDataHandler\XMLFile_Export.xml");
    }

架构如下:

<?xml version="1.0" encoding="iso-8859-1"?>
<xs:schema id="tbl_adress" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
  <xs:element name="tbl_adress" msdata:IsDataSet="true" msdata:UseCurrentLocale="true">
    <xs:complexType>
      <xs:choice minOccurs="0" maxOccurs="unbounded">
        <xs:element name="row">
          <xs:complexType>
            <xs:attribute name="delete" type="xs:string" />
            <xs:attribute name="Forename" type="xs:string" />
            <xs:attribute name="Surname" type="xs:string" />
            <xs:attribute name="MobileNr" type="xs:string" />
          </xs:complexType>
        </xs:element>
      </xs:choice>
    </xs:complexType>
  </xs:element>
</xs:schema>

我创建了一个名为 "tbl_adress" 的数据集,并将数据表放入该数据集中。 通过这个根节点元素被称为 "tbl_adress".

有了我得到的其他答案,我可以用架构解决问题。