将提取的Xml元素写入Xml而无需其他标记

时间:2012-03-23 22:18:55

标签: c# xml xml-serialization

首先:我需要实现的是编写一个Xml文档Header,然后从现有的Xml文件中取出一些元素并将它们放入我的文档Header中。

最后,我需要将一些对象解析到同一个文件中。 生成的文件必须与特定方案匹配,因为它应该由程序导入。

到目前为止,我希望这是可以理解的。

我的问题是:

我已经编写了我的文档的标题并提取了第二个文档的元素。 但我无法将它们写入我的Header文件,而在尝试再次加载时没有出现多个错误。

就像我在上面所说的那样:我需要与第二个文件中提取的完全相同的标签,而不需要使用c#来添加一些额外内容,例如声明标记。


根据“如何询问”页面的要求,我将尝试重述我尝试过的所有内容。

现在我的失败史;) 下面的代码是经过2天尝试后我最终得到的代码。我之前尝过一些,但这个可能是“最”工作的一个:

   XElement rootElement = XElement.Load(@filepath);                

        FileStream fs = new FileStream(@Savepath, FileMode.Append);                              


        IEnumerable<XElement> elements = rootElement.Descendants("Extract1");                    
        foreach (XElement item in elements)
        {
            Console.WriteLine(item);
            item.Save(fs); 
        }                                                                                    


        IEnumerable<XElement> elements2 = rootElement.Descendants("Extract2"); 
        foreach (XElement item in elements2)
        {
            Console.WriteLine(item);
            item.Save(fs);                                                                                       

        }
        fs.Close();

控制台输出如下所示:

 <Extract1>
       <childnodes />
 </Extract1>
 <Extract2>
   <childnodes />
 </Extract2>

这正是我想要的文件,所以不像我选择了错误的节点。 但是通过保存到文件中会出现一个神奇的声明标签,而Xml看起来就像下面那样。

<?xml version="1.0" encoding="UTF-8"?> 
<Extract1>
    <childnodes />
</Extract1><?xml version="1.0" encoding="UTF-8"?> 
<Extract2>
    <childnodes />
</Extract2>

所以我再也无法读取文件了。

我试过

XmlWriterSettings settings = new XmlWriterSettings();
settings.OmitXmlDeclaration = true;

也。这会杀死声明标签,但我现在仍然无法读取该文件 这部分“得分”是一个错误。

<Extract1>
    <childnodes />
</Extract1><Extract2>

我尝试的最后一件事是将提取的项目写入List listX并使用下面的代码序列化它们

XmlSerializer serializer = new XmlSerializer(typeof(List<XElement>));
            TextWriter textWriter = new StreamWriter(@savepath);
            serializer.Serialize(textWriter, listX);
            textWriter.Close();

但现在我得到了这些

<ArrayOfXElement xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
 xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<XElement>

总结一下我的问题:有没有办法读出这些节点并将它们“粘贴”到另一个文件中,而不添加额外的标签?

顺便说一句,我想保留原始的Xml文件,只删除我不想要的所有节点,但首先可能需要很长时间,因为这些是非常大的Xml文件,其次,它们是部分生成的自动,所以我没有每个名字。

1 个答案:

答案 0 :(得分:1)

当您编写Save()XElement时,它会假定您要编写完整的XML文档,以便添加标记。

最好的解决方案可能是将它们添加到XDocument并在完成后立即保存。

但是一个简短的解决方案,即当前代码的最小变化:

Console.WriteLine(item);
//item.Save(fs); 
fs.WriteLine(item.ToString());

但是使用组(根)标记可能会遇到麻烦。

基于listX的替代方案:

var doc  = new XElement("Extracts", listX);
// add/insert/replace other elements
doc.Save(filePath);