C#-Linq到XML-从查询中排除元素
我有一个XML文件:C#-Linq到XML-从查询中排除元素,c#,linq-to-xml,C#,Linq To Xml,我有一个XML文件: <MyXml> <MandatoryElement1>value</MandatoryElement1> <MandatoryElement2>value</MandatoryElement2> <MandatoryElement3>value</MandatoryElement3> <CustomElement1>value</Custom
<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>
铝脂
帐户查找
C:\Documents and Settings\user1\Desktop\Requests\ALURequests
C:\Documents and Settings\user1\Desktop\Responses
对
C:\Documents and Settings\user1\Desktop\Archive
1.
欧元
HHGKOL
结果是:
<Currency>EUR</Currency>
<AccountingSystem>HHGKOL</AccountingSystem>
EUR
HHGKOL
您可以定义一个必填名称列表,并使用LINQ to XML进行筛选:
var mandatoryElements = new List<string>() {
"MandatoryElement1",
"MandatoryElement2",
"MandatoryElement3"
};
var result = xDoc.Root.Descendants()
.Where(x => !mandatoryElements.Contains(x.Name.LocalName));
var mandatoryements=new List(){
“MandatoryElement1”,
“MandatoryElement2”,
“MandatoryElement3”
};
var result=xDoc.Root.subjections()
.Where(x=>!mandatoryElements.Contains(x.Name.LocalName));
您是创建了此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语句中,您不需要列表。您的问题显示了格式不正确的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"));
stringxml=@”
价值
价值
价值
价值
价值
";
System.Xml.Linq.XDocument xDoc=XDocument.Parse(Xml);
var result=xDoc.Root.subjections()
.Where(x=>!x.Name.LocalName.StartsWith(“MandatoryElement”);
假设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);
}
XElement doc2=XElement.Load(Server.MapPath(“TestXMLFile.xml”);
List _List=doc2.Elements().ToList();
列表_list2=新列表();
foreach(列表中的元素x)
{
如果(!x.Name.LocalName.StartsWith(“必需”))
{
_清单2.添加(x);
}
}
foreach(列表2中的元素y)
{
_列表。删除(y);
}
@freebird:这是可行的,但大多数情况下您无法修改xml以添加更多属性,例如:xml来自远程服务,这是您获得否决票的主要原因,我想您不能跳过列表并执行此操作…var result=xDoc.Root.subjections().Where(x=>!x.Name.LocalName.StartsWith(“mandatoryement”);'MandatoryElement’只是我在示例中选择的一个名称。在实际文件中,MandatoryElements具有有意义的名称。“CustomElements”也是如此。