首页 > 解决方案 > 如何使用数据集在 Visual Basic/C# 中读取和写入相同的 XML 文件?

问题描述

我有一个可以包含任何对象的列表(例如,在我下面复制的实例中,该列表可以有一个“订单”或十个“订单”)。我使用了数据契约,我得到了这个输出(OrderList 中只有一个订单/一个对象):

  <?xml version="1.0"?>
 -<frmStartup.SerializeClass xmlns:i="http://www.w3.org/2001/XMLSchema- 
instance" xmlns="http://schemas.datacontract.org/2004/07/BAKFAA">
 -<Orderlist>
    -<Order>
       <Number>1</Number>
       <OrderDistance>150</OrderDistance>
       -<OffsetX xmlns:a="http://schemas.microsoft.com/Arrays">
          <a:double>59.00</a:double>
          <a:double>70.80</a:double>
        </OffsetX>
       -<OffsetY xmlns:a="http://schemas.microsoft.com/2003">
          <a:double>43</a:double>
          <a:double>54</a:double>
        </OffsetY>
        <deflection>
          <a:double>76</a:double>
          <a:double>23</a:double>
        </deflection>
        <Comment> 2014 10 08 15 19 50</Comment>
     </Order>
  </Orderlist>
</frmStartup.SerializeClass>

根据我对 Data Contract 的理解,它返回程序中已经使用的数据结构。

我被要求创建 XML 输出的新格式(与 Data Contract 创建的不同)。在新任务中,我被要求创建一个与 Data Contract 提供的非常不同的暂定结构。我正在开发一个集成项目,这意味着 3 个不同的程序可以在同一个文件上读写。因此,在输出文件中,还有其他变量甚至在当前程序中都不可用。输出文件需要与此类似(将其与 Data Contract 创建的上述输出进行比较):

  <Country>
    <Company>
       <CompanyName>aa</CompanyName>
          <branch>
              <branchName>bb</branchName>
                <OrderList>
                   <order>
                     <comment>32 53 65 76 854</comment>
                     <OrderDistance>532</OrderDistance>
                       <deflection>
                         <offsetX>0</offsetX>
                         <offsetY>0</offsetY>
                         <deflValue>10.45</deflValue>
                       </deflection>
                       <deflection>
                         <offsetX>0</offsetX>
                         <offsetY>0</offsetY>
                         <deflValue>10.45</deflValue>
                       </deflection>
                  </order>
                    <order>
                 <comment>332 23 45 56 54</comment>
                 <OrderDistance>122</OrderDistance>
                   <deflection>
                     <offsetX>5</offsetX>
                     <offsetY>3</offsetY>
                     <deflValue>10.45</deflValue>
                   </deflection>
                   <deflection>
                     <offsetX>0</offsetX>
                     <offsetY>0</offsetY>
                     <deflValue>10.45</deflValue>
                   </deflection>
              </order>
             </OrderList>
          </branch> 
     </Company>
  </Country>                   

我尝试使用数据集并将值复制到不同的表中,最后从 DataSet 中创建 XML。使用 DataSet 的好处是我可以将 XML 输入文件复制到其中,并且只更改在程序过程中更改的值,并将这些更改与未更改的变量一起保存在输出文件中。这对我来说似乎是一个非常困难的方法,我必须跟踪主键和外键(如果我错了,请纠正我)。请帮助我找到解决此问题的更好方法。

标签: c#xmlvb.netdataset

解决方案


我能够自己解决问题。

我上传了一个所需的输出模板,在程序的根目录中只有一个对象,如下所示:

 <Country>
    <Company>
       <CompanyName>aa</CompanyName>
          <branch>
              <branchName>bb</branchName>
                <OrderList>
                   <order>
                     <comment>32 53 65 76 854</comment>
                     <OrderDistance>532</OrderDistance>
                       <deflection>
                         <offsetX>0</offsetX>
                         <offsetY>0</offsetY>
                         <deflValue>10.45</deflValue>
                       </deflection>
                       <deflection>
                         <offsetX>0</offsetX>
                         <offsetY>0</offsetY>
                         <deflValue>10.45</deflValue>
                       </deflection>
                  </order>
             </OrderList>
          </branch> 
     </Company>
  </Country>   

然后我将上传的 XML 文件读取到数据集,然后从程序中计算程序创建的对象的数量,并在它们中循环以在数据集的表中复制我想要的值。我添加了新行以添加所需信息(列)。为了跟踪表之间的关系,我使用了主键和外键,如下所示:

Public Shared XMLDom As DataSet = New DataSet
XMLDom.ReadXml("../../XMLOutput_template.xml")
 For k = 0 To orderlistInXMl.Count - 1

         XMLDom.Tables("order").Rows.Add()

         XMLDom.Tables("order").Rows(k).Item("orderNumber") = 
         orderlistInXMl.Item(k).DropNumber
         XMLDom.Tables("order").Rows(k).Item("OrderDistance") = 
         basinlistInXMl.Item(k).Distance

         XMLDom.Tables("order").Rows(k).Item("orderlist_id") = 
         XMLDom.Tables("orderlist").Rows(0).Item("orderlist_id")

解决此问题的关键是在程序的根目录中上传所需解决方案的模板。通过这种方式,我不必创建表关系,第二个是上面代码中的最后一个命令,它使用表中父级的主键检查子级的外键。


推荐阅读