当前位置:编程学习 > C#/ASP.NET >>

ds.ReadXmlSchema("xxx.xsd")之后执行ds.GetXmlSchema(),为什么前后两个xsd结构发生改变

该问题和“如何解决数据集DataSet通过XmlDataDocument生成xml文件失真问题”为同一问题。

xsd文件结构如下:
<?xml version="1.0" encoding="UTF-8"?>
<!-- edited with XMLSPY v5 U (http://www.xmlspy.com) by nAcer (Stu) -->
<!-- edited with XMLSpy v2008 rel. 2 sp2 (http://www.altova.com) by jiucai (forcer521.net) -->
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
<xs:element name="Message">
<xs:annotation>
<xs:documentation>Comment describing your root element</xs:documentation>
</xs:annotation>
<xs:complexType>
<xs:sequence>
<xs:element name="Header">
<xs:complexType>
<xs:sequence>
<xs:element name="Version" type="xs:int"/>
<xs:element name="MessageClass" type="xs:int"/>
<xs:element name="MessageType" type="xs:int"/>
<xs:element name="SenderId" type="xs:string"/>
<xs:element name="ReceiverId" type="xs:string"/>
<xs:element name="MessageId" type="xs:long"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="Body">
<xs:complexType>
<xs:sequence>
<xs:element name="ServiceProviderId" type="xs:string"/>
<xs:element name="IssuerId" type="xs:string"/>
<xs:element name="MessageId" type="xs:long"/>
<xs:element name="Count" type="xs:int"/>
<xs:element name="Amount" type="xs:decimal"/>
<xs:element name="Transaction" maxOccurs="unbounded">
<xs:complexType>
<xs:sequence>
<xs:element name="TransId" type="xs:int"/>
<xs:element name="Time" type="xs:dateTime"/>
<xs:element name="Fee" type="xs:decimal"/>
<xs:element name="Service">
<xs:complexType>
<xs:sequence>
<xs:element name="ServiceType" type="xs:short"/>
<xs:element name="Description" type="xs:string"/>
<xs:element name="Detail" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="ICCard">
<xs:complexType>
<xs:sequence>
<xs:element name="CardType" type="xs:short"/>
<xs:element name="NetNo" type="xs:string"/>
<xs:element name="CardId" type="xs:string"/>
<xs:element name="License" type="xs:string"/>
<xs:element name="PreBalance" type="xs:decimal"/>
<xs:element name="PostBalance" type="xs:decimal"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="Validation">
<xs:complexType>
<xs:sequence>
<xs:element name="TAC" type="xs:string"/>
<xs:element name="TransType" type="xs:string"/>
<xs:element name="TerminalNo" type="xs:string"/>
<xs:element name="TerminalTransNo" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="OBU" minOccurs="0">
<xs:complexType>
<xs:sequence>
<xs:element name="NetNo" type="xs:string"/>
<xs:element name="OBUId" type="xs:string"/>
<xs:element name="OBEState" type="xs:string"/>
<xs:element name="License" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="CustomizedData" minOccurs="0"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
<xs:attribute name="ContentType"/>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>



要加载的xml文件如下:
<!-- edited with XMLSPY v5 U (http://www.xmlspy.com) by nAcer (Stu) -->
<Message xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="D:\My Documents\Visual Studio 2008\Projects\TianJinToll\TlqOutProvince\xsd\TransactionOriginal.xsd">
<Header>
<Version>1000000</Version>
<MessageClass>5</MessageClass>
<MessageType>7</MessageType>
<SenderId>9999999912020001</SenderId>
<ReceiverId>9999999911029999</ReceiverId>
<MessageId>1</MessageId>
</Header>
<Body ContentType="1">
<ServiceProviderId>9999999912030001</ServiceProviderId>
<IssuerId>9999999911010001</IssuerId>
<MessageId>1</MessageId>
<Count>4</Count>
<Amount>40</Amount>
<Transaction>
<TransId>2</TransId>
<Time>2010-08-02T00:00:00+08:00</Time>
<Fee>10</Fee>
<Service>
<ServiceType>1</ServiceType>
<Description>接口测试</Description>
<Detail>1 05 0 0 0 20100802 000000 03</Detail>
</Service>
<ICCard>
<CardType>22</CardType>
<NetNo>1101</NetNo>
<CardId>12</CardId>
<License>北京2号卡</License>
<PreBalance>10</PreBalance>
<PostBalance>0</PostBalance>
</ICCard>
<Validation>
<TAC>-735029273</TAC>
<TransType>System.Byte[]</TransType>
<TerminalNo>System.Byte[]</TerminalNo>
<TerminalTransNo>-1738604406</TerminalTransNo>
</Validation>
<CustomizedData>241325431</CustomizedData>
</Transaction>
<Transaction>
<TransId>3</TransId>
<Time>2010-08-02T00:00:00+08:00</Time>
<Fee>10</Fee>
<Service>
<ServiceType>1</ServiceType>
<Description>接口测试</Description>
<Detail>1 05 0 0 0 20100802 000000 03</Detail>
</Service>
<ICCard>
<CardType>22</CardType>
<NetNo>1101</NetNo>
<CardId>13</CardId>
<License>北京3号卡</License>
<PreBalance>10</PreBalance>
<PostBalance>0</PostBalance>
</ICCard>
<Validation>
<TAC>-146992673</TAC>
<TransType>System.Byte[]</TransType>
<TerminalNo>System.Byte[]</TerminalNo>
<TerminalTransNo>-735029273</TerminalTransNo>
</Validation>
<CustomizedData>241325431</CustomizedData>
</Transaction>
<Transaction>
<TransId>4</TransId>
<Time>2010-08-02T00:00:00+08:00</Time>
<Fee>10</Fee>
<Service>
<ServiceType>1</ServiceType>
<Description>接口测试</Description>
<Detail>1 05 0 0 0 20100802 000000 03</Detail>
</Service>
<ICCard>
<CardType>22</CardType>
<NetNo>1101</NetNo>
<CardId>14</CardId>
<License>北京4号卡</License>
<PreBalance>10</PreBalance>
<PostBalance>0</PostBalance>
</ICCard>
<Validation>
<TAC>-1738604406</TAC>
<TransType>System.Byte[]</TransType>
<TerminalNo>System.Byte[]</TerminalNo>
<TerminalTransNo>1609100687</TerminalTransNo>
</Validation>
<CustomizedData>241325431</CustomizedData>
</Transaction>
<Transaction>
<TransId>1</TransId>
<Time>2010-08-02T00:00:00+08:00</Time>
<Fee>10</Fee>
<Service>
<ServiceType>1</ServiceType>
<Description>接口测试</Description>
<Detail>1 05 0 0 0 20100802 000000 03</Detail>
</Service>
<ICCard>
<CardType>22</CardType>
<NetNo>1101</NetNo>
<CardId>11</CardId>
<License>北京1号卡</License>
<PreBalance>10</PreBalance>
<PostBalance>0</PostBalance>
</ICCard>
<Validation>
<TAC>281788145</TAC>
<TransType>System.Byte[]</TransType>
<TerminalNo>System.Byte[]</TerminalNo>
<TerminalTransNo>-146992673</TerminalTransNo>
</Validation>
<CustomizedData>241325431</CustomizedData>
</Transaction>
</Body>
</Message>

我的程序代码如下:
  private void button4_Click(object sender, EventArgs e)
  {
  XmlDataDocument doc = new XmlDataDocument();//先建立XmlDataDocument,

  DataSet ds = doc.DataSet;//然后建立DataSet,并将XmlDataDocument的DataSet属性赋给它,

  ds.ReadXmlSchema("TransactionOriginal.xsd");//然后DataSet加载架构,

  doc.Load("TransactionOriginal.xml");//最后XmlDataDocument加载文档

  DataRow dr = ds.Tables["Transaction"].NewRow();
  dr["TransId"] = 5;
  dr["Time"] = DateTime.Now;
  dr["Fee"] = 5.00;
  dr["CustomizedData"] = "测试:此节点应该出现在最后,而不应该Fee节点之后!";
  dr["Body_Id"] = 0;
  ds.Tables["Transaction"].Rows.Add(dr);
  int iTransaction_Id = int.Parse(dr["Transaction_Id"].ToString());

  dr = ds.Tables["Service"].NewRow();
  dr["ServiceType"] = 5;
  dr["Description"] = 5;
  dr["Detail"] = 5;
  dr["Transaction_Id"] = iTransaction_Id;
  ds.Tables["Service"].Rows.Add(dr);

  doc.Save("Order_out.xml");
  }

运行后CustomizedData节点的位置相对于xsd文件中定义的位置失真,求大侠解决此问题 --------------------编程问答-------------------- 补充,上述引用到的相类似问题的帖子为
http://topic.csdn.net/u/20100828/17/2f3a5e1d-9d12-4cb6-abe3-dcdde95d9fef.html?57763 --------------------编程问答-------------------- http://msdn.microsoft.com/zh-cn/library/1t4362sd.aspx
http://www.cnblogs.com/cmzzlh/articles/419766.html --------------------编程问答-------------------- ReadXmlSchema生成关系映射
Load或 LoadXml加载   XML   数据。 
加载关系数据,DataSet指定为XmlDataDocument构造函数中的参数
http://msdn.microsoft.com/zh-cn/library/1t4362sd.aspx --------------------编程问答--------------------   学习下~ --------------------编程问答-------------------- 我看到了楼上引用页的这句话:使 XmlDataDocument 与 DataSet 同步的另一个优点是避免了 XML 文档的失真。如果 DataSet 是使用 ReadXml 从 XML 文档中填充的,那么当使用 WriteXml 以 XML 文档形式写回数据时,数据可能大大不同于初始的 XML 文档。这是因为 DataSet 不维护 XML 文档中的格式设置(如空白)或分层信息(如元素顺序)。DataSet 也不包含 XML 文档中因为不匹配 Dataset 架构而被忽略的元素。通过使 XmlDataDocument 与 DataSet 同步,可以在 XmlDataDocument 中维护初始 XML 文档的格式设置和分层元素结构,而 DataSet 仅包含适用于 DataSet 的数据和架构信息。
同时也是照着做的,可实际的结果还是发生失真:
如果只是更改和删除(注意:不是增加dataset中的tatable的记录)dataset中的某一个datable的记录,dataset输出xml格式不会发生改变,但是如果增加一条记录,则输出的xml格式就会发生新增记录的元素顺序改变。 --------------------编程问答-------------------- 我说的这个现象和具体的xsd内容有关系,如果有熟悉这方面的朋友最好按照我的例子做一下便明白问题的现象了。
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,