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

Linq to XML: Queries for If blocks C#

要在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));
}

您可能希望在属性丢失或包含空值的情况下添加异常处理。