C# - Linq to XML - 从查询中排除元素

时间:2012-10-11 11:12:00

标签: c# linq-to-xml

我有这个XML文件:

<MyXml>
    <MandatoryElement1>value</MandatoryElement1>
    <MandatoryElement2>value</MandatoryElement2>
    <MandatoryElement3>value</MandatoryElement3>
    <CustomElement1>value</CustomElement1>
    <CustomElement2>value</CustomElement2>
<MyXml>

所有名为'MandatoryElementX'的3个元素将始终显示在文件中。名为“CustomElementX”的元素未知。这些可以由用户自由添加或删除,并具有任何名称。

我需要的是获取所有不是MandatoryElements的元素。所以对于上面的文件我想要这个结果:

<CustomElement1>value</CustomElement1>
<CustomElement2>value</CustomElement2>

我不知道自定义元素的名称可能是什么,只有3个MandatoryElements的名称,因此查询需要以某种方式排除这3个。

修改
尽管有人回答,但我想澄清一下这个问题。这是一个实际的文件:

<Partner>
    <!--Mandatory elements-->
    <Name>ALU FAT</Name>
    <InterfaceName>Account Lookup</InterfaceName>
    <RequestFolder>C:\Documents and Settings\user1\Desktop\Requests\ALURequests</RequestFolder>
    <ResponseFolder>C:\Documents and Settings\user1\Desktop\Responses</ResponseFolder>
    <ArchiveMessages>Yes</ArchiveMessages>
    <ArchiveFolder>C:\Documents and Settings\user1\Desktop\Archive</ArchiveFolder>
    <Priority>1</Priority>

    <!--Custom elements - these can be anything-->
    <Currency>EUR</Currency>
    <AccountingSystem>HHGKOL</AccountingSystem>
</Partner>

这里的结果将是:

<Currency>EUR</Currency>
<AccountingSystem>HHGKOL</AccountingSystem>

4 个答案:

答案 0 :(得分:2)

您可以定义强制名称列表,并使用LINQ to XML进行过滤:

 var mandatoryElements = new List<string>() {
                   "MandatoryElement1", 
                   "MandatoryElement2", 
                   "MandatoryElement3"
                };

 var result = xDoc.Root.Descendants()
                  .Where(x => !mandatoryElements.Contains(x.Name.LocalName));

答案 1 :(得分:0)

您是否已创建此xml或者是否由其他人/应用程序获取? 如果是你的,我建议你不要给它编号。你可以做点什么

<MyXml>     
   <MandatoryElement id="1">value<\MandatoryElement>
   <MandatoryElement id="2">value<\MandatoryElement>     
   <MandatoryElement id="3">value<\MandatoryElement>
   <CustomElement id="1">value<\CustomElement>
   <CustomElement id="2">value<\CustomElement> 
<MyXml> 

在LINQ语句中,您不需要列表。

答案 2 :(得分:0)

您的问题显示格式不正确的XML,但我认为这是一个拼写错误,真正的Xml可以加载到XDocument类中。

试试这个......

string xml = @"<MyXml> 
    <MandatoryElement1>value</MandatoryElement1> 
    <MandatoryElement2>value</MandatoryElement2> 
    <MandatoryElement3>value</MandatoryElement3> 
    <CustomElement1>value</CustomElement1> 
    <CustomElement2>value</CustomElement2> 
</MyXml> ";

System.Xml.Linq.XDocument xDoc = XDocument.Parse(xml);
var result = xDoc.Root.Descendants() 
                 .Where(x => !x.Name.LocalName.StartsWith("MandatoryElement")); 

答案 3 :(得分:0)

让我们说TestXMLFile.xml将包含你的xml,

 XElement doc2 = XElement.Load(Server.MapPath("TestXMLFile.xml"));



List<XElement> _list = doc2.Elements().ToList(); 

List<XElement> _list2 = new List<XElement>();

foreach (XElement x in _list)
{
    if (!x.Name.LocalName.StartsWith("Mandatory"))
    {

        _list2.Add(x);
    }
}


foreach (XElement y in _list2)
{
    _list.Remove(y);
}