C# 获取具有筛选子元素的根元素

C# 获取具有筛选子元素的根元素,c#,.net,xml,xpath,linq-to-xml,C#,.net,Xml,Xpath,Linq To Xml,对于以下Xml: <A> <B id=1> <C id=2 /> </B> <B id=3> <C id=4 /> </B> </A> 我希望通过将C的Id值设为4来获得此结果: <A> <B id=3> <C id=4 /> </B> </A> 那么,最好的解决方案是什么?如果我理

对于以下Xml:

<A>
  <B id=1>
    <C id=2 />
  </B>
  <B id=3>
    <C id=4 />
  </B>
</A>

我希望通过将C的Id值设为4来获得此结果:

<A>
  <B id=3>
    <C id=4 />
  </B>
</A>


那么,最好的解决方案是什么?

如果我理解,这就是您想要的:

//*[descendant::C[@id=4]]
i、 e.将
作为子元素的所有元素

顺便说一句,您的XML应该在数字周围加引号,以便格式良好。

假设您有一个表示XML结构的

var doc = XDocument.Parse(@"<A>
  <B id='1'>
    <C id='2' />
  </B>
  <B id='3'>
    <C id='4' />
  </B>
</A>");
可以按如下方式构造由该元素及其父元素组成的新元素:

XElement y = x;

while (x.Parent != null)
{
    x = x.Parent;
    y = new XElement(x.Name, x.Attributes(), y);
}

XDocument result = new XDocument(y);
结果:


使用:

var doc=XDocument.Parse(@)
");
var elementsToRemove=doc.Root.Elements(“B”)
其中(b=>(int)b.元素(“C”).属性(“id”)!=4);
elementsToRemove.Remove();
控制台写入线(doc);
输出:

<A>
  <B id="3">
    <C id="4" />
  </B>
</A>


那么,您想得到元素
B
的子元素
C
id
4
?结构总是一样的吗?标记名?一个
怎么样?@KirillPolishchuk:我想要一个带过滤的children@Henk霍特曼:是的,我需要定义C_id值并获得一个带有筛选子项的值。使用SQL XQuery更容易。修改(//*[非(后代或自我::B[@id=3])和后代::B])!!!此解决方案不会删除不需要的元素!它应该-您可以在例如这个xpath测试仪中尝试它吗:。它将过滤到您作为示例给出的内容(即A下面有B[@id=3],然后是B下面的C[@id=4])。这就是你想要的吗?我需要让元素A从它的子元素中移除不需要的B。另外两个ans做我想做的。但理想情况是只使用XPath!您能在一些在线xpath测试仪中试用它以确认它返回您想要的内容吗?试试任何一种——例如,这里有另一种你可以试试的。当我输入XML和xpath选择器时,
中的A和B被选中,而没有其他选择。如果你使用后代或自我,你会得到A,B和C。啊,我明白你的意思了。我认为那是不可能的。XPath是一种选择语言——它允许您精确地选择节点,但不转换它们。例如,你不能说“给我一个节点,只有它是第5个子节点”。您可以选择第五个子对象本身。要进行转换,您需要使用,但如果您使用的是C#,那么其他答案可能比将XSLT引入到图中更合适。
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>