Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/15.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# 为什么我的查询返回属性的点,而不是它们的值?_C#_Xml_Winforms_Linq To Xml - Fatal编程技术网

C# 为什么我的查询返回属性的点,而不是它们的值?

C# 为什么我的查询返回属性的点,而不是它们的值?,c#,xml,winforms,linq-to-xml,C#,Xml,Winforms,Linq To Xml,我正在读取一个xml文件并运行一个查询,该查询查找“meetsMark”=1的任何条目,然后检查这些条目的“SUMMARY”元素以及“sum”和“number”属性。代码似乎找到了正确的项目,因为输出显示了每个房间返回的“sum”和“number”的准确数量。如何在不调用“.value”的情况下返回属性的值。当我使用“.Value”时,它会工作,除非有任何条目没有这些属性,否则我会得到一个null异常。下面是我的代码和xml snip List<string> test = ne

我正在读取一个xml文件并运行一个查询,该查询查找“meetsMark”=1的任何条目,然后检查这些条目的“SUMMARY”元素以及“sum”和“number”属性。代码似乎找到了正确的项目,因为输出显示了每个房间返回的“sum”和“number”的准确数量。如何在不调用“.value”的情况下返回属性的值。当我使用“.Value”时,它会工作,除非有任何条目没有这些属性,否则我会得到一个null异常。下面是我的代码和xml snip

  List<string> test = new List<string>(); 

          var groups = from x in doc.Descendants("GROUP")
        where (string)x.Attribute("meetsMark") == "1"
        select x;

        foreach (var subgroup in groups)
        {
            //adds the code for any rooms found as 'ROOM: (Name)'
            test.Add("ROOM: " + (string)subgroup.Attribute("code") + Environment.NewLine);

            test.Add("ITEMS:" + Environment.NewLine);

            var sums = from summary in subgroup.Descendants("SUMMARY")
                       select summary;

            foreach (var sum in sums)
            {
                test.Add("sum = " + (string)subgroup.Attribute("sum"));
                test.Add("number = " + (string)subgroup.Attribute("number"));                                       
            }
            //add a blank line at the end to seperate each room
            test.Add(Environment.NewLine);                                
        }

        var message = string.Join(Environment.NewLine, test);
        MessageBox.Show(message);      
List test=newlist();
变量组=从文档子体(“组”)中的x开始
其中(字符串)x.Attribute(“meetsMark”)=“1”
选择x;
foreach(组中的var子组)
{
//添加找到的任何房间的代码为“房间:(名称)”
test.Add(“房间:”+(字符串)subgroup.Attribute(“代码”)+Environment.NewLine);
test.Add(“ITEMS:+Environment.NewLine”);
var SUMMES=来自子组子代中的摘要(“摘要”)
选择摘要;
foreach(var总和)
{
test.Add(“sum=”+(string)subgroup.Attribute(“sum”);
test.Add(“number=”+(string)subgroup.Attribute(“number”);
}
//在末尾添加一个空行以分隔每个房间
test.Add(Environment.NewLine);
}
var message=string.Join(Environment.NewLine,test);
MessageBox.Show(message);
下面是它正在读取的xml

<?xml version="1.0" encoding="utf-8"?>
<GROUP id="GRP1">
  <GROUP id="GRP2" code="MAIN" meetsMark="0">
    <GROUP id="GRP3" code="Room1" meetsMark="1">
      <ITEMS>
        <ITEM id="ITM6">
          <SUMMARY sum="Room1-Item1-Sum1" number="1"></SUMMARY>
        </ITEM>
        <ITEM id="ITM14">
          <SUMMARY sum="Room1-Item2-Sum1" number="2"></SUMMARY>
        </ITEM>
        <ITEM id="ITM15">
          <SUMMARY sum="Room1-Item3-Sum1" number="3"></SUMMARY>
        </ITEM>
        <ITEM id="ITM15">
          <SUMMARY sum="Room1-Item4-Sum1" number="4"></SUMMARY>
        </ITEM>
      </ITEMS>
    </GROUP>
    <GROUP id="GRP4" code="Room2" meetsMark="1">
      <ITEMS>
        <ITEM id="ITM95">
          <SUMMARY sum="Room2-Item1-Sum1" number="1"></SUMMARY>
        </ITEM>
        <ITEM id="ITM96">
          <SUMMARY sum="Room1-Item2-Sum1" number="2"></SUMMARY>
        </ITEM>
        <ITEM id="ITM97">
          <SUMMARY sum="Room1-Item3-Sum1" number="3"></SUMMARY>
        </ITEM>
      </ITEMS>
    </GROUP>
  </GROUP>
</GROUP>

它将返回房间,并显示我要查询的每个属性的点,但不显示它们的值。如何获取这些值并避免由于调用.Value而导致的空异常问题,并使其命中没有与查询匹配的属性的条目?

我想您的意思是:

foreach (var sum in sums)
{
    test.Add("sum = " + (string)sum.Attribute("sum"));
    //                          ^^^ not subgroup
    test.Add("number = " + (string)sum.Attribute("number"));
    //                             same
}

您发布的代码在任何地方都不包含
.Value
。相反,它将属性转换为
string
,这也是我要做的。@JonSkeet-我提到它只是为了不让人们来回答:只使用.Value。但这意味着这里没有任何问题。你已经完全展示了你是如何做到这一点的——你投到了弦上。不清楚你为什么要问什么。别担心,Stefan回答了。不,Stefan指出了一个完全不同的问题。你的问题与
.Value
无关,而与得到错误的结果有关。不幸的是,您谈到了获得一个异常,这是您所展示的代码所不具备的。请从中学习,并确保你更仔细地问下一个问题。读一读哦,我的天哪,这只是一个调用正确的项目的问题。谢谢你告诉我,我真的很困惑。我们都去过;-)