首先:我需要实现的是编写一个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文件,其次,它们是部分生成的自动,所以我没有每个名字。
答案 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);