C#-merge XML文件但保留两个文件中的所有内容,包括版本号

时间:2009-10-26 22:09:35

标签: xml

假设我有两个XML文件。

第一个XML文件:

<?xml version="1.0"?>
    <AccessRequest xml:lang="en-US">
        <AccessLicenseNumber>Your_License</AccessLicenseNumber>
        <UserId>Your_ID</UserId>
        <Password>Your_Password</Password>
    </AccessRequest>

第二个XML文件:

   <?xml version="1.0"?>
    <RatingServiceSelectionRequest xml:lang="en-US">
     <CustomerContext>Rating and Service</CustomerContext>
    </RatingServiceSelectionRequest>

现在,当我将它们合并为两个时,我希望输出如下:

<?xml version="1.0"?>
<AccessRequest xml:lang="en-US">
    <AccessLicenseNumber>Your_License</AccessLicenseNumber>
    <UserId>Your_ID</UserId>
    <Password>Your_Password</Password>
</AccessRequest>
<?xml version="1.0"?>
<RatingServiceSelectionRequest xml:lang="en-US">
  <CustomerContext>Rating and Service</CustomerContext>
</RatingServiceSelectionRequest>

当我使用google上的常用方法合并这两个文件时,版本号等正在被吃掉,而且RatingServiceSelectionRequest节点最终成为AccessRequest节点的一部分,这显然不是我想要的。

我如何在C#.Net中处理此问题?

注意:我想要它的原因是因为我正在使用的这个API正在请求它,所以我猜没有两种方法。

3 个答案:

答案 0 :(得分:4)

不能有两个顶级节点

<强> <AccessRequest>

<强> <RatingServiceSelectionRequest>

在格式良好的XML文件中 - 根据定义 - 格式良好的XML文件具有一个且只有一个根节点。

此外,您不能在单个文件中包含两个XML处理说明 <?xml version="1.0"?> - 大多数情况下,文件中间不会有一个。

所以你需要引入一个新的“人工”根,或者在另一个根元素之下粘贴XML。

如果您确实必须保留该格式,那么您只需将这两个文件连接为字符串:

string file1Contents = File.ReadAllText(@"file1.xml");
string file2Contents = File.ReadAllText(@"file2.xml");

File.WriteAllText(@"merged.xml", file1Contents + file2Contents);

这里没有XML魔法......

答案 1 :(得分:0)

xml标头的“丢失”(btw通常是所需的特性),可能是使用XML / DOM感知方法进行合并的结果。相反,只需将文件作为纯文本读取,然后按顺序写入。

正如Marc S指出的那样,这将导致XML文件无效,但如果这是你想要/需要的......

在重新阅读问题时,关于第二个文件的内容被插入到前一个文件的节点末尾的“抱怨”提示您希望保留一个有效的XML文件,尽管这个数据存在于数据中从第二个文件未集成到此节点。因此,您肯定需要引入一个额外的节点作为组合结果的根节点。 (目前这些文件都有自己的根元素。)

答案 2 :(得分:0)

此API看起来很熟悉;)

我们在这里使用相同的,他们确实需要一个接一个。我假设你也使用API​​提供的.xsd来生成你的请求类。

所有这一切,我们创建了一个“帮助器”类,它将请求(访问和速率)序列化为字符串,连接字符串并将结果作为字节数组发布到目标URL。

我们课程的突破是:

助手类 - &gt;序列化一个对象并将其作为字符串返回(在本例中为xml字符串)

客户端类 - &gt;创建一个通过WebRequest发布到目标系统的字节数组。