Linq to XML: Queries for If blocks C#
本文关键字:If blocks for Queries to XML Linq | 更新日期: 2023-09-27 18:16:12
我已经像这样设置了XML
<customers>
<customer id="1">
<name title="Mr" first="John" last="Smith" />
<contact number="07123123123" email="john.smith@johnsmith.com" />
<address postcode="E1 1EW">1 Paper Street, London, England, GB</address>
</customer>
(...)
</customers>
我试图查询它与Linq到XML的学习目的。到目前为止,我可以使用XDocument。加载文件和添加/删除等。但是,我似乎找不到一种方法来查询我的XML文档,以便在if块中使用。例如(伪代码):
XDocument document = XDocument.Load("People.xml");
if(
exists(
document.customers.customer.name.first.value("john")
&& document.customers.customer.name.last.value("smith")
)
)
{
bool exists = true;
}
无论我做什么,编译器要么嘲笑我,要么吐槽说它不能隐式地将可枚举bool型转换为bool型。
我一直在尝试许多组合的东西从许多不同的谷歌搜索一段时间了,我认为猜测是开始做弊大于利,谁能提供一个c#片段,将工作在一个if块为我的xml设置?看看姓和名是否同时存在于同一节点中。通常情况下,一旦我看到某样东西确实有效,我就可以从那里着手了。我在网上找到的大多数问题只是搜索整个节点是否存在,或者只是搜索一个属性,而我似乎无法定制它。
(在有人对我的XML结构大发雷霆之前,这不是为了生产目的,我只是想掌握一下如何在即将到来的项目中使用它。)
额外的爱,任何人可以链接任何文档,不是MSDN(我已经在它上打开了大约10个标签),并涉及一些很好的低水平/初学者教程Linq到XML
要在XML中检查John Smith是否作为客户存在,您将使用
XDocument doc = XDocument.Load(Path);
var customers = doc.Descendants("customer");
//To Check for John Smith
if (customers.Elements("name")
.Any(E => E.Attribute("first").Value == "John"
&& E.Attribute("last").Value == "Smith"))
{
//Do your thing
}
创建一个名为check的布尔值来保存结果。有多少名为name的元素具有First=john和last=smith的属性然后将结果设置为check变量。
顺便说一句,您的XML在John前面缺少一个"。这会给你带来麻烦的
bool check;
var res = XDocument.Load(@"c:'temp'test.xml");
var results = res.Descendants("name")
.Where(x => x.Attribute("first").Value == "john" && x.Attribute("last").Value == "smith")
.Select(x => x.Elements()).Count();
check = results != 0;
XPath是您的朋友
using System.Xml.XPath;
...
void foo(){
XDocument document = XDocument.Load("People.xml");
var firstCustomerNode = document.XPathSelectElement(
"/customers/customer[0]/name"
);
var hasfirstNameAndLastName = firstCustomerNode.Attribute("firstname") != null && firstCustomerNode.Attribute("lastname") != null;
if(hasfirstNameAndLastName)
{
}
}
请注意,您也可以使用模式来验证您的Xml,但它编写起来更复杂。
如果不想使用XPath,还可以这样写:
var firstCustomerNode = document.Root.Element("Customers").Elements("customer").First().Element("name");
但是老实说,XPath查询的可读性要高得多,并且将简化错误检查。这段代码假设目标节点之前的所有元素都存在。如果没有,您的代码将会失败,因为NullReferenceException
很差。
首先查询Document.Root.Descendants
。然后是IfExists
var nodes = document.Root.Descendants("customer");
bool IfExists(string FirstName, string LastName) {
return nodes.Elements("name").Any(node =>
node.Attribute("first").Value.Equals(FirstName) &&
node.Attribute("last").Value.Equals(LastName));
}
您可能希望在属性丢失或包含空值的情况下添加异常处理。