C#数据集使用名称空间保存XML问题
我正在使用DataSet读取XML文件和XSD模式,但当我保存 DataSet.WriteXML()中的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 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="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="MySchema.xsd"">
<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>