2013-03-06 86 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'需要測試或錯字不知道。