2

我已经像这样设置了 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;
}

无论我尝试什么,编译器要么嘲笑我,要么吐出一些关于它如何不能将 Ienumerable bool 隐式转换为 bool 的东西。

一段时间以来,我一直在尝试来自许多不同谷歌搜索的事物的多种组合,我认为猜测开始弊大于利,任何人都可以提供一个可以在我的 xml 设置的 if 块中工作的 C# 片段吗?只是看看名字和姓氏是否一起存在于同一个节点中。通常,一旦我看到某些东西确实有效,我就可以从那里拿走它。我在网上找到的大多数问题都只是搜索整个节点是否存在或只搜索一个属性,我似乎无法对其进行定制。

(在有人对我的 XML 结构起火之前,这不是出于生产目的,我只是想掌握如何使用它,以防我需要在即将进行的项目中使用它。)

对于任何可以链接任何非 MSDN 文档的人(我已经打开了大约 10 个选项卡)并涉及一些关于 Linq to XML 的良好低级/初学者教程的人,都是额外的爱。

4

4 回答 4

3

要检查您的 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
}
于 2013-05-31T14:34:55.677 回答
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));
}

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

于 2013-05-31T14:49:49.903 回答
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.

于 2013-05-31T14:34:16.097 回答
0

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

顺便说一句,您的 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;
于 2013-05-31T14:42:07.493 回答