对于以下Xml:
<A>
<B id=1>
<C id=2 />
</B>
<B id=3>
<C id=4 />
</B>
</A>
我希望通过将C值设为4来获得此结果:
<A>
<B id=3>
<C id=4 />
</B>
</A>
那么,什么是最好的解决方案?
答案 0 :(得分:1)
假设您有一个代表XML结构的XDocument
var doc = XDocument.Parse(@"<A>
<B id='1'>
<C id='2' />
</B>
<B id='3'>
<C id='4' />
</B>
</A>");
和XElement表示该文档中包含id='4'
的元素
XElement x = doc.Descendants().Single(e => (int?)e.Attribute("id") == 4);
您可以构建一个由该元素及其父元素组成的新XDocument,如下所示:
XElement y = x;
while (x.Parent != null)
{
x = x.Parent;
y = new XElement(x.Name, x.Attributes(), y);
}
XDocument result = new XDocument(y);
结果:
<A>
<B id="3">
<C id="4" />
</B>
</A>
答案 1 :(得分:1)
使用:
var doc = XDocument.Parse(@"<A>
<B id='1'>
<C id='2' />
</B>
<B id='3'>
<C id='4' />
</B>
</A>");
var elementsToRemove = doc.Root.Elements("B")
.Where(b => (int)b.Element("C").Attribute("id") != 4);
elementsToRemove.Remove();
Console.WriteLine(doc);
输出:
<A>
<B id="3">
<C id="4" />
</B>
</A>
答案 2 :(得分:0)
如果我理解,这就是你想要的:
//*[descendant::C[@id=4]]
即。所有以<c id="4"/>
为孩子的元素。
顺便说一句,您的XML应该在数字周围引用格式良好。