2012-10-11 144 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); 
}