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

如何解决数据集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文件中定义的位置失真,求大侠解决此问题 --------------------编程问答-------------------- 不是很懂 帮你顶顶 --------------------编程问答-------------------- 太感谢了,好人,帮置顶的也给加分 --------------------编程问答-------------------- 可以用xml文件数据直接生成一个DataSet,而不考虑原先那个xsd数据集? --------------------编程问答-------------------- 不是很懂 帮你顶顶 --------------------编程问答-------------------- 我也在头疼DATASET与XML序列化问题。 --------------------编程问答-------------------- 你在 doc.Save("Order_out.xml"); 之前加一句 ds.AcceptChanges();
试试看。 --------------------编程问答-------------------- 加了,还是不行。 --------------------编程问答-------------------- 问题的关键在于:
执行ds.ReadXmlSchema("TransactionOriginal.xsd");
然后再执行ds.GetXmlSchema();
但是得到的xsd文件内容与TransactionOriginal.xsd内容已经发生一些结构性的改变,因此想通过dataset产生xml文件未能通过xsd验证。
但是如何解决该问题呢?请高手继续指点,依然感谢上面的各位朋友。 继续等待答案.... --------------------编程问答-------------------- 不是很懂!如果你明白了,继续说下意思! --------------------编程问答-------------------- --------------------编程问答-------------------- 我是说,对于一个实现定义好的架构(xsd文件),将他引入到dataset之后,然后再通过该dataset的GetXmlSchema()方法得到的该dataset架构与之前实现定义好的架构(xsd文件)内容发生了改变.怎么避免这个问题? --------------------编程问答-------------------- 帮顶。。没做过 --------------------编程问答-------------------- ds.WriteXmlSchema("TransactionOriginal.xsd");  //??
参考:http://msdn.microsoft.com/zh-cn/library/41732z18(VS.80).aspx --------------------编程问答-------------------- 你这个xsd文件不是在vs.net中做的,它和dataSet兼容吗?
dataSet的层级是dataSet->dataTable->dataColumn,
你这个xsd文件的层级是Message->Body->Transaction->CustomizeData.
最好用vs.net中xsd文件编辑器测试一下,我记得vs.net中自带了一个xsd文件编辑器。 --------------------编程问答-------------------- 这个还没有做过。有点高级的样子。  阿捷  --------------------编程问答--------------------
引用 14 楼 qy300 的回复:
你这个xsd文件不是在vs.net中做的,它和dataSet兼容吗?
dataSet的层级是dataSet->dataTable->dataColumn,
你这个xsd文件的层级是Message->Body->Transaction->CustomizeData.
最好用vs.net中xsd文件编辑器测试一下,我记得vs.net中自带了一个xsd文件编辑器。

我的xsd文件使用xml spy制作的,在vs.net中也可以使用,你说的Message->Body->Transaction->CustomizeData层次结构实际上是嵌套关系,在vs.net中表示就是CustomizeData是Body的下级元素 --------------------编程问答--------------------
引用 13 楼 luols 的回复:
ds.WriteXmlSchema("TransactionOriginal.xsd"); //??
参考:http://msdn.microsoft.com/zh-cn/library/41732z18(VS.80).aspx

这个方法我也试过,执行ds.WriteXmlSchema("TransactionOriginal.xsd")之后得到的xsd文件和TransactionOriginal.xsd的内容发生了改变,这实际上也是症结所在,可是怎么避免这个问题呢? --------------------编程问答-------------------- 一般用于dataset的xsd的element的嵌套关系是3层,比如Body->Transaction->CustomizeData 或Message->Body->Transaction, 这样和dataSet->dataTable->dataColumn相对应的。你这个xsd文件有4层Message->Body->Transaction->CustomizeData.,那么读入dataset时怎么处理呢?必定要作调整,在ds.WriteXmlSchema("TransactionOriginal.xsd")后的xsd文件就不一致。
你把ds.WriteXmlSchema("TransactionOriginal.xsd")保存的XSD仔细看一下,嵌套关系应该只有3层,而不会是你原来的4层。 --------------------编程问答-------------------- TransactionOriginal.xsd文件是项目上大家共同遵守的架构,现在还是想寻求怎样解决dataset在加载了架构信息后,生成的xml失真的问题,继续等待...
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,