gpt4 book ai didi

c# - 如何过滤 xml 部分并将其保存为文件

转载 作者:太空宇宙 更新时间:2023-11-03 11:41:20 24 4
gpt4 key购买 nike

我是 LINQ 的初学者。我有一个格式如下的 xml 数据

<Root>
<Global>
</Global>
<local>
<element name="A">
<subelement name="A">
<element name="A1">
<subelement name="A1">
<Property>
</Property>
</subelement>
</element>
<element name="B">
<Property>
</Property>
</element>
</subelement>
<subelement name="B">
<element name="A">
<Property>
</Property>
</element>
<element name="B">
<Property>
</Property>
</element>
</subelement>
</element>
</local>
</Root>

我想将 Property 元素的每个部分保存到它自己的 xml 文件中,如下所示,同时保持层次结构完整

<Root>
<Global>
</Global>
<local>
<element name="A">
<subelement name="A">
<element name="A1">
<subelement name="A1">
<Property>
</Property>
</subelement>
</element>
</subelement>
</element>
</local>
</Root>

<Root>
<Global>
</Global>
<local>
<element name="A">
<subelement name="A">
<element name="B">
<Property>
</Property>
</element>
</subelement>
</element>
</local>
</Root>

等等所有 Property 元素。每个元素可以有一个子子元素,每个子元素可以有元素子元素

您能否提供一个解决方案,说明如何将 Property 元素的每个部分保存为一个新的 xml 文件,同时保持当前的层次结构不变。我试过使用 XElement 类的 Ancestor() 方法

XDocument xml = XDocument.Load(filename);
XDocument convertedQuery = new XDocument(
new XElement(xml.Root.Name, from x in xml.Descendants("local")
select x.Ancestors())
);

但它也返回其他 Property 元素,如下所示

<Root>
<Global></Global>
<local>
<element name="A">
<subelement name="A">
<element name="A1">
<subelement name="A1">
<Property></Property>
</subelement>
</element>
<element name="B">
<Property></Property>
</element>
</subelement>
<subelement name="B">
<element name="A">
<Property></Property>
</element>
<element name="B">
<Property></Property>
</element>
</subelement>
</element>
</local>

任何帮助将不胜感激。谢谢

最佳答案

这是一些 C# 示例,它们应该可以满足您的需求,或者至少让您了解如何实现它。用于测试的示例只是将每个创建的 XDocument 写入 Console.Out 但当然您可以将其更改为保存到磁盘上的文件:

static void Main(string[] args)
{
XDocument doc = XDocument.Load(@"..\..\XMLFile1.xml");
foreach (XElement prop in doc.Descendants("Property"))
{
XDocument result = new XDocument(
new XElement(doc.Root.Name, doc.Root.Attributes(),
doc.Root.Elements("Global"),
CopySubtree(prop.Ancestors("local").First(), prop)));
result.Save(Console.Out);
Console.WriteLine();
}
}
static XElement CopySubtree(XElement ancestor, XElement descendant)
{
if (ancestor == descendant)
{
return descendant;
}
else
{
return
new XElement(
ancestor.Name,
ancestor.Attributes(),
CopySubtree(
ancestor
.Elements()
.First(e => e.DescendantsAndSelf().Any(d => d == descendant)),
descendant));
}
}

[编辑]对于不仅复制 Property 祖先而且复制其 sibling 的新要求,您可以按如下方式调整上述方法:

static XElement CopySubtree(XElement ancestor, XElement descendant)
{
if (ancestor == descendant.Parent)
{
return ancestor;
}
else
{
return
new XElement(
ancestor.Name,
ancestor.Attributes(),
CopySubtree(
ancestor
.Elements()
.First(e => e.DescendantsAndSelf().Any(d => d == descendant)),
descendant));
}
}

关于c# - 如何过滤 xml 部分并将其保存为文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4704801/

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