这是我的XML片段(只有几个条目,而实际上有大约一千个)。
<?xml version="1.0" encoding="UTF-8"?>
<information_code version="3.5">
<entry code="000" title="Function, data for plans and description"/>
<entry code="001" title="Title page"/>
<entry code="002" title="List of pages or data modules"/>
<entry code="003" title="Change records and highlights"/>
<entry code="004" title="Access illustration"/>
</information_code>
我需要做的是将'code'属性与我传递给我的查询的值匹配,然后返回'title'属性的值。这真的不应该很难,但我会绕圈子去。
这是我目前所处的位置,但它总是被捕获而没有匹配。我的查询显然有问题。
private string getInfoName(string infoCode)
{
XDocument mydoc = XDocument.Load(GlobalVars.pathToInfoCodes);
string name = string.Empty;
try
{
var entry = mydoc
.Elements("entry")
.Where(e => e.Attribute("code").Value == infoCode)
.Single();
name = entry.Attribute("title").Value;
}
catch
{
MessageBox.Show("Info code not recognised: " + infoCode);
}
return name;
}
答案 0 :(得分:1)
问题在于,当您使用<information_code>
时,它只会搜索您当前所在的级别,此时此级别为<entry>
- 因此此处没有.Element("information_code").Elements("entry")
个元素。
您可以使用.Descendants
或使用string wantedCode = "001";
var title = XDocument.Load(GlobalVars.pathToInfoCodes)
.Descendants("entry")
.Where(e => e.Attribute("code")?.Value == wantedCode)
.Select(e => e.Attribute("title").Value).FirstOrDefault();
:
var title = (from e in XDocument.Load("data.xml").Descendants("entry")
where e.Attribute("code")?.Value == wantedCode
select e.Attribute("title")?.Value).FirstOrDefault();
您也可以使用查询语法执行此操作。可能看起来更好:
?.
请注意,null
语法是C#6.0 Null Propagation。如果您使用的是早期的C#版本,则必须将该属性存储在变量中,检查它是否为.Value
,然后才能访问Object.assign