2013-03-06 60 views
0

我有这个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> 

我有基于此文件中的设置来创建两个集合,从XML标记的集合。 根据用户的需要,某些“字段”标签可能具有或不具有“插入”和“更新”属性。

插入采集将所有具有插入=“true”或不存在 更新采集将所有具有更新=“true”或不存在

对于没有标签的标记标签他们中的任何一个都默认为true。

我写这个查询插入

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; 

其中给出名称,名字,姓氏

有人能帮助我在这里?

问候。

+0

“不给所需要的结果” 是远远不够的信息。与你希望它做什么相比,它做了什么? (顺便说一下,我注意到你根本没有使用'update'。) – 2013-03-06 13:23:30

+0

编辑了问题以显示查询的结果。 – Codehelp 2013-03-06 13:28:02

+0

如果你想编辑你的文章来很好地格式化XML,这将会非常有帮助。目前很难阅读...... – 2013-03-06 13:38:32

回答

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); 
+0

@RaphaëlAlthaus不,你不需要使用Value属性。明确的演员将做到这一点 – 2013-03-06 13:41:24

+0

@RaphaëlAlthausnope,我没有在任何地方使用属性节点的值。以前(在编辑之前)它是'!insert.HasValue || insert == true',它也可以工作 – 2013-03-06 13:42:42

+1

K,现在很清楚! – 2013-03-06 13:44:07

0

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

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

编辑 如果<Name insert='fasle'需要测试或错字不知道。