2012-10-11 107 views
0

排除元素我有这个XML文件:C# - LINQ到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> 

回答

2

您可以定义强制性的名单,并使用LINQ到XML过滤:

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

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

你觉得我的解决方案也能发挥作用? – freebird

+0

@freebird:我没有downvote你的 –

+0

我问你,如果我的答案会起作用? – freebird

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-Statement中,你不需要List。

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")); 
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); 
}