Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 当我';我试图在同一个XML文件中找到多个值?_C#_.net_Xml_Linq - Fatal编程技术网

C# 当我';我试图在同一个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的元素的第一次出现。这是正确的方法吗?似乎

我必须提取属于XML文件中某些元素的值,这就是我最终得到的结果

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)