2013-03-06 2 views
0

У меня есть этот 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> 

Я должен создать две коллекции на основе параметров в этом файле. В зависимости от потребностей пользователей определенный тег «Поле» может иметь или не иметь атрибуты «вставить» и «обновить».

коллекция

Вставка будет иметь все теги, которые имеют вставку = «истинный» или нет настоящего коллекция Обновление будет иметь все теги, которые имеют обновление = «истинный» или нет настоящего

Для тегов, которые не по умолчанию они имеют значение 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; 

Который дает имя, ПгвЬЫат, LastName

Может кто-то помочь мне здесь?

С уважением.

+0

"не дает нужный результат" не хватает почти информации. Что он делает, по сравнению с тем, что вы хотели этого сделать? (Заметьте, вы вообще не используете 'update'. –

+0

Отредактировал вопрос, чтобы показать результат запроса. – Codehelp

+0

Это действительно помогло бы, если бы вы отредактировали сообщение, чтобы отформатировать XML тоже. На данный момент очень трудно читать ... –

ответ

0

Атрибут Cast с нулевым значением boolean. Для отсутствующих атрибутов вы получите null. Тогда просто проверить, если 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. Явный оператор-оператор сделает это –

+0

@ RaphaëlAlthaus nope, я не использую значение узла атрибута в любом месте. Ранее (перед редактированием) это было '! Insert.HasValue || insert == true', который также работает –

+1

K, теперь это понятно! –

0

Вы можете попытаться изменить where части в

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

EDIT Не знаю, если <Name insert='fasle' требуется для испытания или опечатки.