c# - 如何使用数据集在 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 输入文件复制到其中,并且只更改在程序过程中更改的值,并将这些更改与未更改的变量一起保存在输出文件中。这对我来说似乎是一个非常困难的方法,我必须跟踪主键和外键(如果我错了,请纠正我)。请帮助我找到解决此问题的更好方法。
解决方案
我能够自己解决问题。
我上传了一个所需的输出模板,在程序的根目录中只有一个对象,如下所示:
<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")
解决此问题的关键是在程序的根目录中上传所需解决方案的模板。通过这种方式,我不必创建表关系,第二个是上面代码中的最后一个命令,它使用表中父级的主键检查子级的外键。
推荐阅读
- javascript - 如何使用 document.createElement("img") 在 javascript 中显示带有类的 img?
- mysql - 如何避免我的 Express API 被公司防火墙阻止
- c# - 通过 DBContext .Net Core 的 OnModelCreating 存储自定义类属性,如 String
- mysql - 使用 SQL 清理列中的数据
- yubikey - 如何解码 Yubikey OTP 令牌?
- google-apps-script - Google表格通过根据匹配值附加列来添加注释
- python-3.x - 类型提示产生“TypeError:类型对象不可下标”
- excel - 对象_global范围的方法失败 - 每个循环都很简单
- java - 这个错误是什么意思“java.util.stream.ReferencePipeline$3 不能转换为 org.springframework.data.domain.Page”
- python - 在python中打开或关闭组合/排列4个主题