多元素xml查询变量

时间:2012-12-01 14:03:12

标签: c# xml linq linq-to-xml

我的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值。

3 个答案:

答案 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;