C#数据集使用名称空间保存XML问题

C#数据集使用名称空间保存XML问题,c#,xml,xsd,dataset,C#,Xml,Xsd,Dataset,我正在使用DataSet读取XML文件和XSD模式,但当我保存 DataSet.WriteXML()中的XML文件,以前的命名空间信息已丢失 DataSet ds = new DataSet(); ds.ReadXmlSchema("MySchema.xsd"); ds.ReadXml("MyParams.xml"); 这是我的原始XML: <?xml version="1.0" encoding="UTF-8"?> <MyParams xmlns:xsi="http://w

我正在使用DataSet读取XML文件和XSD模式,但当我保存 DataSet.WriteXML()中的XML文件,以前的命名空间信息已丢失

DataSet ds = new DataSet();
ds.ReadXmlSchema("MySchema.xsd");
ds.ReadXml("MyParams.xml");
这是我的原始XML:

<?xml version="1.0" encoding="UTF-8"?>
<MyParams xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="MySchema.xsd">
结果更好,但并不正确:

<?xml version="1.0" standalone="yes"?>
<NewDataSet xmlns="xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot; xsi:noNamespaceSchemaLocation=&quot;MySchema.xsd&quot;">
  <MyParams>
但是输出是一样的-我仍然有两个问题:

1) 名称空间仍然是“NewDataSet”,应该是“MyParams”,并且 已添加为上面的另一个级别,而不是替换它。 同样,我需要保留“encoding=“UTF-8”部分

2) 我正在对双引号进行编码,但它们不应该被编码 (关于这一部分,我还有一个问题。)

如何解决名称空间问题

下面是我的XSD示例:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
    <xs:element name="MyParams">
        <xs:complexType>
            <xs:sequence>
                <xs:element ref="FirstFolder"/>
                <xs:element ref="SecondFolder"/>
                <xs:element ref="Window"/>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
    <xs:element name="FirstFolder" type="xs:string"/>
    <xs:attribute name="InUse">
        <xs:simpleType>
            <xs:restriction base="xs:boolean">
                <xs:whiteSpace value="collapse"/>
            </xs:restriction>
        </xs:simpleType>
    </xs:attribute>
    <xs:element name="Window">
        <xs:complexType>
            <xs:sequence>
                <xs:element ref="Width"/>
                <xs:element ref="Height"/>
                <xs:element ref="Left"/>
                <xs:element ref="Top"/>
            </xs:sequence>
            <xs:attribute ref="InUse" use="required"/>
        </xs:complexType>
    </xs:element>
    <xs:element name="Width">
        <xs:simpleType>
            <xs:restriction base="xs:integer">
                <xs:minInclusive value="305"/>
            </xs:restriction>
        </xs:simpleType>
    </xs:element>
    <xs:element name="Height">
        <xs:simpleType>
            <xs:restriction base="xs:integer">
                <xs:minInclusive value="242"/>
            </xs:restriction>
        </xs:simpleType>
    </xs:element>
    <xs:element name="Top">
        <xs:simpleType>
            <xs:restriction base="xs:integer"/>
        </xs:simpleType>
    </xs:element>
    <xs:element name="Left">
        <xs:simpleType>
            <xs:restriction base="xs:integer"/>
        </xs:simpleType>
    </xs:element>
    <xs:element name="SecondFolder"/>
</xs:schema>

这是一个示例XML:

<?xml version="1.0" encoding="UTF-8"?>
<MyParams xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="Schemas\MyParams.xsd">
    <FirstFolder>C:\TestFolderOne</FirstFolder>
    <SecondFolder>C:\TestFolderTwo</SecondFolder>
    <Window InUse="true">
        <Width>400</Width>
        <Height>400</Height>
        <Left>100</Left>
        <Top>100</Top>
    </Window>
</MyParams>

C:\TestFolderOne
C:\TestFolderTwo
400
400
100
100

看起来您需要包含WriteSchema选项.ds.WriteXml(@“c:\temp\test.xml”,XmlWriteMode.WriteSchema);我只是读写了xml(没有读模式)输出文件格式与输入文件格式不同。WriteSchema不好,因为无论是否加载XSD,它都会将架构写入xml文件。这有什么问题?文件中有一个命名空间,因此它知道架构是什么,并从命名空间中获取架构。无需加载XSD。
DataSet ds = new DataSet("MyParams");
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
    <xs:element name="MyParams">
        <xs:complexType>
            <xs:sequence>
                <xs:element ref="FirstFolder"/>
                <xs:element ref="SecondFolder"/>
                <xs:element ref="Window"/>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
    <xs:element name="FirstFolder" type="xs:string"/>
    <xs:attribute name="InUse">
        <xs:simpleType>
            <xs:restriction base="xs:boolean">
                <xs:whiteSpace value="collapse"/>
            </xs:restriction>
        </xs:simpleType>
    </xs:attribute>
    <xs:element name="Window">
        <xs:complexType>
            <xs:sequence>
                <xs:element ref="Width"/>
                <xs:element ref="Height"/>
                <xs:element ref="Left"/>
                <xs:element ref="Top"/>
            </xs:sequence>
            <xs:attribute ref="InUse" use="required"/>
        </xs:complexType>
    </xs:element>
    <xs:element name="Width">
        <xs:simpleType>
            <xs:restriction base="xs:integer">
                <xs:minInclusive value="305"/>
            </xs:restriction>
        </xs:simpleType>
    </xs:element>
    <xs:element name="Height">
        <xs:simpleType>
            <xs:restriction base="xs:integer">
                <xs:minInclusive value="242"/>
            </xs:restriction>
        </xs:simpleType>
    </xs:element>
    <xs:element name="Top">
        <xs:simpleType>
            <xs:restriction base="xs:integer"/>
        </xs:simpleType>
    </xs:element>
    <xs:element name="Left">
        <xs:simpleType>
            <xs:restriction base="xs:integer"/>
        </xs:simpleType>
    </xs:element>
    <xs:element name="SecondFolder"/>
</xs:schema>
<?xml version="1.0" encoding="UTF-8"?>
<MyParams xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="Schemas\MyParams.xsd">
    <FirstFolder>C:\TestFolderOne</FirstFolder>
    <SecondFolder>C:\TestFolderTwo</SecondFolder>
    <Window InUse="true">
        <Width>400</Width>
        <Height>400</Height>
        <Left>100</Left>
        <Top>100</Top>
    </Window>
</MyParams>