我的xml看起来像这样:
<root>
<x a1 = "abc">
<y a2 = "def">
<z value1 = 5 value2 = 10 value3 = 15/>
</y>
</x>
</root>
我的主要代码:
static void Main(string[] args)
{
int value;
IEnumerable<XElement> xs = from x in xDoc.Descendants("x")
where (string)x.Attribute("a1") == "abc"
select x;
IEnumerable<XElement> ys = from y in xs.Descendants("y")
where (string)y.Attribute("a2") == "def"
select time;
IEnumerable<XElement> zs = from z in ys.Descendants("z")
where z.Attribute == value1
select z;
}
我正在尝试根据特定条件将int值设置为节点z的值1,2或3。当我尝试过滤节点z中所需的值时,会出现问题。有人可以解释我如何将节点z的匹配值分配给int值。
答案 0 :(得分:0)
如果我理解正确,你想选择z节点的一些元素:
string value = "value1";
var query = xDoc.Descendants("x")
.Where(x => (string)x.Attribute("a1") == "abc")
.Descendants("y")
.Where(y => (string)y.Attribute("a2") == "def")
.Descendants("z")
.Select(z => (string)z.Element(value))
.Select(s => Int32.Parse(s.Replace("\"", "")));
查询结果 - IEnumerable<int>
。如果您确定会有一个值,或者您需要第一个值,则可以应用Single
First
。
另外,我不明白为什么将值保留为"5"
而不是简单5
。
答案 1 :(得分:0)
您可以在此处使用XPath(System.Xml.XPath)
var elemZ = xDoc.XPathSelectElement("//x[@a1='abc']/y[@a2='def']/z");
int val1 = (int)elemZ.Attribute("value1");
将xml更正为<z value1 = "5" value2 = "10" value3 = "15" />
您甚至可以通过单个linq获取所有属性值
var values = elemZ.Attributes().Select(a => (int)a).ToList();
答案 2 :(得分:0)
我认为你需要这样的东西:
IEnumerable<XElement> z's = from z in y.Descendants("z")
where z.Attribute("value1") != null
select z;