从XDocument中选择属性值,其中另一个属性等于特定的字符串值

时间:2015-02-23 12:06:51

标签: c# xml linq

我有以下xml“example”

<methods>
  <method name="listcust" >
    <objects>
      <object name="ExampleTest" type="" version="">
        <properties>
          <property name="FirstName" type="text">
            <mappings>
              <mapping type="property">
                <property name="fn" />
              </mapping>
            </mappings>
          </property>
          <property name="LastName" type="text">
            <mappings>
              <mapping type="property">
                <property name="ln" />
              </mapping>
            </mappings>
          </property>
          <property name="BirthDate" type="datetime">
            <mappings>
              <mapping type="property">
                <property name="bd" />
              </mapping>
            </mappings>
          </property>
        </properties>
      </object>
    </objects>
  </method>
</methods>

我试图选择说“

”的“名称”属性值
<property name="LastName"  type="text">

当该元素中的属性的“名称”时  等于“ln”<property name="ln" />

我尝试了以下

var query = from p in xdoc.Descendants("property")
            where p.Descendants("property").Attributes("name").Contains(new XAttribute("name", "ln"))
            select p.Attribute("name").Value;

var res = query.ToList<string>();

但我得到的结果为零。

如果我一步一步地分解它

XDocument xdoc = XDocument.Parse(xml);
var props = xdoc.Descendants("property").Descendants("property");
var nameAtt = props.Attributes("name");
var contains = nameAtt.Contains(new XAttribute("name", "ln"));

然后我可以看到 nameAtt 包含一个属性列表,包括<property name="ln" />一个,但包含 bool仍然是假的

如果有人可以请指出正确的方法来执行select \ where或perharps甚至是一种完全不同的更有效的方法来检索其子节点属性值等于传入的属性值的一个属性值

由于

1 个答案:

答案 0 :(得分:3)

您只需更改Where条件:

where p.Descendants("property").Any(x => (string)x.Attribute("name") == "In")

Any会检查是否有任何元素的name属性等于In