gpt4 book ai didi

c# - 拆分 XML 文档,从重复元素创建多个输出文件

转载 作者:数据小太阳 更新时间:2023-10-29 02:06:47 26 4
gpt4 key购买 nike

我需要获取一个 XML 文件并根据输入文件的重复节点创建多个输出 xml 文件。源文件“AnimalBatch.xml”如下所示:

<?xml version="1.0" encoding="utf-8" ?>
<Animals>
<Animal id="1001">
<Quantity>One</Quantity>
<Adjective>Red</Adjective>
<Name>Rooster</Name>
</Animal>
<Animal id="1002">
<Quantity>Two</Quantity>
<Adjective>Stubborn</Adjective>
<Name>Donkeys</Name>
</Animal>
<Animal id="1003">
<Quantity>Three</Quantity>
<Color>Blind</Color>
<Name>Mice</Name>
</Animal>
</Animals>

程序需要拆分重复的“Animal”并生成 3 个文件,分别命名为:Animal_1001.xml、Animal_1002.xml 和 Animal_1003.xml

每个输出文件应该只包含它们各自的元素(这将是根)。 AnimalsBatch.xml 的 id 属性将为 Animal_xxxx.xml 文件名提供序列号。 id 属性不需要在输出文件中。


Animal_1001.xml:
<?xml version="1.0" encoding="utf-8"?>
<Animal>
<Quantity>One</Quantity>
<Adjective>Red</Adjective>
<Name>Rooster</Name>
</Animal>


Animal_1002.xml
<?xml version="1.0" encoding="utf-8"?>
<Animal>
<Quantity>Two</Quantity>
<Adjective>Stubborn</Adjective>
<Name>Donkeys</Name>
</Animal>


Animal_1003.xml>
<?xml version="1.0" encoding="utf-8"?>
<Animal>
<Quantity>Three</Quantity>
<Adjective>Blind</Adjective>
<Name>Mice</Name>
</Animal>

我想使用 XmlDocument 执行此操作,因为它需要能够在 .Net 2.0 上运行。

我的程序是这样的:

    static void Main(string[] args)
{
string strFileName;
string strSeq;

XmlDocument doc = new XmlDocument();
doc.Load("D:\\Rick\\Computer\\XML\\AnimalBatch.xml");

XmlNodeList nl = doc.DocumentElement.SelectNodes("Animal");

foreach (XmlNode n in nl)
{
strSeq = n.Attributes["id"].Value;

XmlDocument outdoc = new XmlDocument();
XmlNode rootnode = outdoc.CreateNode("element", "Animal", "");

outdoc.AppendChild(rootnode); // Put the wrapper element into outdoc

outdoc.ImportNode(n, true); // place the node n into outdoc
outdoc.AppendChild(n); // This statement errors:
// "The node to be inserted is from a different document context."

strFileName = "Animal_" + strSeq + ".xml";

outdoc.Save(Console.Out);
Console.WriteLine();
}
Console.WriteLine("END OF PROGRAM: Press <ENTER>");
Console.ReadLine();
}

我认为我有两个问题。

A) 在将节点 n 上的 ImportNode 执行到 outdoc 之后,我调用了 outdoc.AppendChild(n),它提示:“要插入的节点来自不同的文档上下文。”我不知道这是否是在 ForEach 循环中引用节点 n 的范围问题 - 或者我是否以某种方式没有正确使用 ImportNode() 或 AppendChild。 ImportNode() 的第二个参数设置为 true,因为我希望 Animal 的子元素(任意命名为 Quantity、Adjective 和 Name 的 3 个字段)最终出现在目标文件中。

B) 第二个问题是将 Animal 元素放入 outdoc 中。我得到 '' 但我需要 ' ' 所以我可以将节点 n 放在其中。我认为我的问题是我在做什么:outdoc.AppendChild(rootnode);

为了显示 xml,我正在做:outdoc.Save(Console.Out);我确实有将 save() 保存到输出文件的代码 - 只要我能正确组装 outdoc,它就可以工作。

有一个类似的问题:Split XML in Multiple XML files ,但我还不了解解决方案代码。我想我已经非常接近这种方法了,非常感谢您提供的任何帮助。

我将使用 XmlReader 执行相同的任务,因为我需要能够处理大型输入文件,而且我知道 XmlDocument 会读取整个文件并可能导致内存问题。

最佳答案

这是一个简单的方法,看起来就是您要找的东西

public void test_xml_split()
{
XmlDocument doc = new XmlDocument();
doc.Load("C:\\animals.xml");
XmlDocument newXmlDoc = null;

foreach (XmlNode animalNode in doc.SelectNodes("//Animals/Animal"))
{
newXmlDoc = new XmlDocument();
var targetNode = newXmlDoc.ImportNode(animalNode, true);
newXmlDoc.AppendChild(targetNode);
newXmlDoc.Save(Console.Out);
Console.WriteLine();
}
}

关于c# - 拆分 XML 文档,从重复元素创建多个输出文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11912109/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com