Linq to XML:查询If块C#

时间:2013-05-31 14:26:58

标签: c# xml linq

我已经设置了这样的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 to XML查询它以用于学习目的。到目前为止,我可以XDocument.Load文件很好,添加/删除等。但我似乎无法找到一种方法来查询我的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#片段,可以在我的xml的if块中工作建立?只是为了查看同名节点中的名字和姓氏是否一起存在。通常一旦我看到实际工作的东西,我就可以从那里拿走它。我在网上找到的大多数问题只是搜索整个节点是否存在或者只搜索一个属性而我似乎无法定制它。

(在任何人为我的XML结构迸发火焰之前,这不是出于制作目的,我只是想在将来需要的项目中使用它。)

对任何可以链接任何不是M​​SDN的文档(我已经在其上打开大约10个标签)的任何人的热爱,并且涉及到Linq to XML的一些好的低级/初级教程。

4 个答案:

答案 0 :(得分:3)

要检查John Smith是否在您的XML中作为客户存在,您将使用

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
}

答案 1 :(得分: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而失败。

答案 2 :(得分:0)

创建一个名为check的布尔值来保存结果。 算一下名为name的元素有多少属性First = john和last = smith 然后将结果设置为检查变量。

顺便说一句,你的XML错过了“在约翰面前。这会给你带来问题:”

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;

答案 3 :(得分:0)

您需要先查询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));
}

如果属性缺失或包含空值,您可能需要添加异常处理。