gpt4 book ai didi

C# 返回具有祖先和自身但没有其他子元素的 XML 元素

转载 作者:太空宇宙 更新时间:2023-11-03 15:26:22 25 4
gpt4 key购买 nike

我有一个像这样的 xml 文档布局

<?xml version="1.0" encoding="utf-8" ?>
<Document name="document name">
<DataSet name="dataset 1">
<Dimension name="dimension 1">
<Metric name="metric 1">
<Data value="1">
<Data value="2">
<Data value="3">
</Metric>
<Metric name="metric 2">
<Data value="4">
<Data value="5">
<Data value="6">
</Metric>
</Dimension>
<Dimension name="dimension 2">
<Metric name="metric 3">
<Data value="6">
<Data value="7">
<Data value="8">
</Metric>
<Metric name="metric 4">
<Data value="9">
<Data value="10">
<Data value="11">
</Metric>
</Dimension>
</DataSet>
</Document>

我试图将指标与他们的祖先分开,而不是与他们的 sibling 分开。例如我想要一个文件看起来像...

<?xml version="1.0" encoding="utf-8" ?>
<Document name="document name">
<DataSet name="dataset 1">
<Dimension name="dimension 1">
<Metric name="metric 1">
<Data value="1">
<Data value="2">
<Data value="3">
</Metric>
</Dimension>
</DataSet>
</Document>

和文件 2 看起来像......

<?xml version="1.0" encoding="utf-8" ?>
<Document name="document name">
<DataSet name="dataset 1">
<Dimension name="dimension 1">
<Metric name="metric 2">
<Data value="4">
<Data value="5">
<Data value="6">
</Metric>
</Dimension>
</DataSet>
</Document>

我尝试解决这个问题是创建一个方法来接受 xmlfile、outputDirectory、elementName、attributeName 和 attributeValue。

这将允许我在文档中搜索特定指标,并将其连同其整个树一起提取到自己的文件中,但不能与其兄弟一起提取。

在我的方法的顶部,我有...

XDocument doc = XDocument.Load(xmlFile);

IEnumerable<XElement> elementsInPath = doc.Descendants()
.Elements(elementName)
.Where(p => p.Attribute(attributeName).Value.Contains(attributeValue))
.AncestorsAndSelf()
.InDocumentOrder()
.ToList();

但是,当我遍历 elementsInPath 时,输出给出匹配的“指标”的所有父项,每个父项返回其所有子项,而我想要的唯一子项是与输入参数匹配的子项。

如有任何帮助,我们将不胜感激。仅供引用,我使用以下代码片段保存文件

                int i = 1;
foreach (XElement element in elementsInPath)
{
XDocument tmpDoc = new XDocument();
tmpDoc.Add(element);
tmpDoc.Save(outputDirectory + elementName + "_" + i + ".xml");
i++;
}

另请注意,如果我使用以下代码,我会得到我正在寻找的确切指标,但我需要将它们封装在它们的父级中。

IEnumerable<XElement> elementsInPath = doc.Descendants(elementName)
.Where(p => p.Attribute(attributeName).Value.Contains(attributeValue))
.InDocumentOrder()
.ToList();

最佳答案

因此,您实际上是在为每个 Metric 元素构建一个新文档。最直接的方法是:

foreach (XElement el in doc.Root.Descendants("Metric"))
{
XElement newDoc =
new XElement("Document",
new XAttribute(doc.Root.Attribute("name")),
new XElement("DataSet",
new XAttribute(el.Parent.Parent.Attribute("name")),
new XElement("Dimension",
new XAttribute(el.Parent.Attribute("name")),
el)
)
)
);
newDoc.Save(el.Attribute("name").Value.Replace(" ", "_") + ".xml");
}

这有望说明动态版本的工作原理 - 遍历祖先并基于它们创建新元素:

foreach (XElement el in doc.Root.Descendants("Metric"))
{
XElement newDoc = el;
foreach(XElement nextParent in el.Ancestors()) // iterate through ancestors
{
//rewrap in ancestor node name/attributes
newDoc = new XElement(nextParent.Name, nextParent.Attributes(), newDoc);
}

newDoc.Save(el.Attribute("name").Value.Replace(" ", "_") + ".xml");
}

仅使用 Ancestors() 功能是行不通的,因为当您尝试添加它们时,它还会添加它们的子元素(您要拆分的元素的兄弟元素)。

关于C# 返回具有祖先和自身但没有其他子元素的 XML 元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35154590/

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