请帮我解决下面提到的具有xml的场景,我想要C#LINQ中的代码
<?xml version="1.0" encoding="utf-8" ?>
<root>
<Countries>
<Country name="India">
<state id="1"> Tamilnadu</state>
<state> Karnataka</state>
</Country>
<Country name="America">
<state id="1"> WI</state>
<state> AW </state>
</Country>
<Country name="Africa">
<state id="1"> Melbourne</state>
<state> sydney </state>
</Country>
</Countries>
</root>
如何获取属性id = 1到LINQ的状态,因为我能够获取属性名称=“印度”?如何给id = 1我的意思是没有“1”的数值
答案 0 :(得分:2)
如果您使用的是C#
,则可以执行以下操作:
XDocument document = XDocument.Load("filePath");
var states = (from state in document.Root.Descendants("state")
where state.Attribute("id") != null && state.Attribute("id").Value == "1"
select state).ToList();
答案 1 :(得分:2)
您可以执行以下操作:
空检查非常重要,因为根据您的结构判断,如果没有空检查,您将获得NullReferenceException
。
XDocument xml = XDocument.Load("yourFileLocation");
var items = document.Root.Descendants("state")
.Where(s => s.Attribute("id") != null && s.Attribute("id").Value == "1")
.ToList();
答案 2 :(得分:2)
请尝试以下操作。
XDocument xml = XDocument.Load(file);
XElement state = xml.Root.Descendants("Country")
.First(c => c.Attribute("name").Value == "India")
.Descendants("state")
.First(s => (int)s.Attribute("id") == 1);
下次发布您先试过的内容,以便我们为您提供代码帮助。
我也没有空检查。如果找不到值,它将在First()
上消亡。由你来做自己的安全检查。
答案 3 :(得分:0)
我发现现有的答案过于冗长冗长。想象一下,如果您要根据多个属性进行选择会发生什么?
最紧凑和最具表现力的解决方案是使用XPath扩展(来自System.Xml.XPath
命名空间)。
例如,要在印度获得id = 1的州:
var xdoc = XDocument.Load(file);
foreach (var element in xdoc.XPathSelectElements("//Country[@name='India']/state[@id=1]"))
{
Console.WriteLine("State " + element.Value + ", id " + (int)element.Attribute("id"));
}
要获得所有国家/地区中分配了任何ID的所有州:
foreach (var element in xdoc.XPathSelectElements("//state[@id]"))
{
Console.WriteLine("State " + element.Value + ", id " + (int)element.Attribute("id"));
}
等
您可以找到XPath规范here。