C# 当我';我试图在同一个XML文件中找到多个值?
我必须提取属于XML文件中某些元素的值,这就是我最终得到的结果C# 当我';我试图在同一个XML文件中找到多个值?,c#,.net,xml,linq,C#,.net,Xml,Linq,我必须提取属于XML文件中某些元素的值,这就是我最终得到的结果 XDocument doc = XDocument.Load("request.xml"); var year = (string)doc.Descendants("year").FirstOrDefault(); var id = (string)doc.Descendants("id").FirstOrDefault(); 我猜对于每一条语句,我都在遍历整个文件,寻找名为year/id的元素的第一次出现。这是正确的方法吗?似乎
XDocument doc = XDocument.Load("request.xml");
var year = (string)doc.Descendants("year").FirstOrDefault();
var id = (string)doc.Descendants("id").FirstOrDefault();
我猜对于每一条语句,我都在遍历整个文件,寻找名为year/id的元素的第一次出现。这是正确的方法吗?似乎必须有一种方法可以避免不必要的迭代。我知道我在寻找什么,我知道即使值可能为null,元素也会在那里
我在考虑一个select语句的行,同时使用“year”和“id”作为条件
为了获得许可,我正在寻找某些元素及其各自的值。同一元素很可能会多次出现,但FirstOrDefault()就可以了
进一步澄清:
按照传奇人物乔恩·斯基特的要求,我将尝试进一步澄清。XML文档包含2015
和123032
等字段,我需要这些值。我知道我在寻找哪些元素,它们会在那里。在下面的示例XML中,我希望得到2015、皇帝、某物和30
示例XML:
<?xml version="1.0" encoding="UTF-8"?>
<documents xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<make>Apple</make>
<year>2015</year>
<customer>
<name>The Emperor</name>
<level2>
<information>something</information>
</level2>
<age>30</age>
</customer>
苹果
2015
皇帝
某物
30
一段不会对整个xml进行两次解析的代码如下:
XDocument doc = XDocument.Load("request.xml");
string year = null;
string id = null;
bool yearFound = false, idFound = false;
foreach (XElement ele in doc.Descendants())
{
if (!yearFound && ele.Name == "year")
{
year = (string)ele;
yearFound = true;
}
else if (!idFound && ele.Name == "id")
{
id = (string)ele;
idFound = true;
}
if (yearFound && idFound)
{
break;
}
}
正如您所看到的,您正在用代码行换取速度:-)我确实觉得代码仍然非常可读
如果您真的需要优化到最后一行代码,您可以将元素的名称放在两个变量中(因为否则将有许多临时的XName
创建)
然后
if (!yearFound && ele.Name == yearName)
...
if (!idFound && ele.Name == idName)
您应该确切地说明您要查找的内容—特别是,当前您的
id
和year
元素可以完全分开,在文档根之外没有共同的祖先。如果您希望这些是单独的查询,并且如果您不关心除了第一个元素之外的任何内容,那么这很好。。。但这可能不是您想要做的。向我们展示xml是什么样子(只是一个简短的模板),以及您想要实现什么(例如,我需要按年份和id请求节点)
if (!yearFound && ele.Name == yearName)
...
if (!idFound && ele.Name == idName)