根据特定属性从XML获取标记集合

时间:2013-03-06 13:21:55

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

我有这个xml文件

<config>
  <PersonMapping>
    <Field>
      <Name>Id</Name>
      <Position>0</Position>
    </Field>
    <Field>
      <Name>FirstName</Name>
      <Position>1</Position>
    </Field>
    <Field>
      <Name>LastName</Name>
      <Position>2</Position>
    </Field>
    <Field>
      <Name insert='false' update='false'>Address1</Name>
      <Position>3</Position>
    </Field>
    <Field>
      <Name insert='false' update='false'>Address2</Name>
      <Position>4</Position>
    </Field>
  </PersonMapping>
</config>

我必须根据此文件中的设置创建两个集合。 根据用户的需要,某些“字段”标记可能有也可能没有“插入”和“更新”属性。

插入集合将包含所有具有insert ='true'或不存在的标记 更新集合将包含所有具有update ='true'或不存在的标记

对于没有任何一个标签的标签,默认情况下为真。

我为insert

写了这个查询
propertiesToInsertFromXML = from nameTag in xml.Element("Config").Element("PersonMapping").Elements("Field")
                            let insert = nameTag.Element("Name").Attribute("insert")
                            let update = nameTag.Element("Name").Attribute("update")
                            where insert == null || (bool)insert  && update == null || (bool)update
                            select nameTag.Element("Name").Value;

其中包含Name,FirstName,LastName

有人可以帮助我吗?

问候。

2 个答案:

答案 0 :(得分:0)

您可以尝试将where部分更改为

where (insert == null || Convert.ToBoolean(insert.Value))

EDIT 不知道是否需要<Name insert='fasle'进行测试或拼写错误。

答案 1 :(得分:0)

将属性转换为可以为空的布尔值。对于缺少的属性,您将获得空值。然后,只需验证insert是否没有值(属性丢失)或其值是true

var insertTags = from name in xml.Descendants("Name")
                 let insert = (bool?)name.Attribute("insert") 
                 where !insert.HasValue || insert.Value
                 select (string)name;

备注: insert变量的类型Nullable<bool>此处不属于XAttribute类型。


与XPath相同:

var insertTags = xml.XPathSelectElements("//Name[@insert='true'or not(@insert)]")
                    .Select(n => (string)n);