C# c语言中的窄xdocument
是否有任何方法可以切断xDocument的某些部分,然后仍然获得xDocument?通过切断,我的意思是保留选定的节点。 我有这样的XML: 我需要xDocument对象,它只包含我需要的Name=属性的对象。我知道这很简单,但我找不到。编辑:C# c语言中的窄xdocument,c#,xml,C#,Xml,是否有任何方法可以切断xDocument的某些部分,然后仍然获得xDocument?通过切断,我的意思是保留选定的节点。 我有这样的XML: 我需要xDocument对象,它只包含我需要的Name=属性的对象。我知道这很简单,但我找不到。编辑: 我说的是很多非常庞大的XML文件。因此,我不能只选择要删除的内容。您的意思是只需要第一个子节点?是的,使用扩展方法很简单: doc.Root.Elements().Skip(1).Remove(); 样本: using System; using Sy
我说的是很多非常庞大的XML文件。因此,我不能只选择要删除的内容。您的意思是只需要第一个子节点?是的,使用扩展方法很简单:
doc.Root.Elements().Skip(1).Remove();
样本:
using System;
using System.Linq;
using System.Xml.Linq;
class Test
{
static void Main()
{
var doc = new XDocument(new XElement ("root",
new XElement("child1", new XElement("grandchild1")),
new XElement("child2", new XElement("grandchild2"))));
Console.WriteLine("Document before:");
Console.WriteLine(doc);
doc.Root.Elements().Skip(1).Remove();
Console.WriteLine("Document after:");
Console.WriteLine(doc);
}
}
输出:
Document before:
<root>
<child1>
<grandchild1 />
</child1>
<child2>
<grandchild2 />
</child2>
</root>
Document after:
<root>
<child1>
<grandchild1 />
</child1>
</root>
谢谢你的新知识,我不知道。但我的xml的结构要复杂得多,我需要更多的东西来缩小它的范围,属性名=我唯一需要的对象need@ArkadiuszRaszeja:那么你应该把它放在问题中,而不是说你只需要保留第一个元素。我回答了你的问题,因为这就是我要做的。不过,您应该能够修改我的答案——只需将Skip改为Where子句,它选择您不想保留的每个元素。正如我所说的,我的XML的结构非常复杂,所以选择要删除的元素没有意义。选择我想要保留的东西更容易。@ArkadiuszRaszeja:如果你想这样做,那好。我已经给了你一个原始问题的答案,现在给你一个修改后的答案,并举例说明。如果你决定忽略这些,那是你的选择。。。但我建议申请一个单程证!从要选择的元素转换为要删除的元素的角色非常简单…@ArkadiuszRaszeja:我放弃了。我已经尽可能清楚地解释了如何回答您提出的问题,并给出了简单的解决方案。我怀疑你是否能找到其他人来回答你仍然不清楚的问题。我建议你删除它,然后在删除时进行编辑,或者问一个新问题,更努力地澄清,以避免浪费别人的时间。现在你改变了问题,使我的答案看起来无效-请不要这样做。接下来,您的XML可能不是这样的-我怀疑您实际上有XML属性,而不是表单Name=唯一需要的对象的文本节点。我建议您将问题还原到以前的版本,我将编辑我的答案,以解决更一般的问题。您的问题也非常不清楚如果只需要一个嵌套元素会发生什么。您只是试图从顶层修剪元素,还是修剪树的所有类型的位?总体而言,我需要在object中使用name=唯一需要的对象的lev2中的所有名称。我尝试了xdoc.Elements.Wherex=>x.Attributexmlns+Name.Value.ToString==我唯一需要的对象。FirstOrDefault;但我得到了一个错误,比如x变量并没有被调用,翻译成德语…这非常非常不清楚。请阅读并在问题上投入更多的精力。提供一个合适的XML输入文档和预期的输出,以及您已经尝试过的内容。在某些孙子元素需要保留而其他元素不需要保留的情况下,确保您清楚自己想要什么。我甚至没有发现您的错误消息是德语。我想你应该能够看到,在那次评论之前很久,我就已经对缺乏清晰性失去了耐心。。。当然不涉及种族歧视,但我不喜欢浪费时间在变化和不清楚的问题上。不过,应该没有必要使用IQueryable。
Document before:
<root>
<child1>
<grandchild1 />
</child1>
<child2>
<grandchild2 />
</child2>
</root>
Document after:
<root>
<child1>
<grandchild1 />
</child1>
</root>
doc.Root
.Elements()
.Where(x => (string) x.Attribute("name") != "name to keep")
.Remove();