【问题标题】:Select attribute value from XDocument where another attribute equals specific string value从 XDocument 中选择属性值,其中另一个属性等于特定的字符串值
【发布时间】:2015-02-23 12:06:51
【问题描述】:

我有以下xml“示例”

<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>

我正在尝试选择say的“名称”属性值

<property name="LastName"  type="text">

当该元素内的属性的“名称” 等于“ln”&lt;property name="ln" /&gt;

我尝试了以下

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 包含属性列表,包括 &lt;property name="ln" /&gt; 之一,但 contains 布尔值仍然是 false

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

谢谢

【问题讨论】:

    标签: c# xml linq


    【解决方案1】:

    您只需要更改Where 条件:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-01-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多