Обработка xml в Linq (C #): подсчет потомков / элементов и проверка количества = X - PullRequest
0 голосов
/ 28 апреля 2011

С учетом XML-документа:

<Root xmlns="http://foo" xmlns:bar="http://bar">
    <Child Name="one" bar:Type="type1" />
    <Child Name="two" bar:Caption="captionvalue" /> 
</Root>

Какой самый эффективный способ сделать следующее с помощью корня XElement (который имеет элемент Root):

  1. Убедитесь, что есть только два дочерних элемента в качестве потомков
  2. Для каждого атрибута в каждом дочернем элементе, если пространство имен равно http://bar, тогда вызовите BarFunction (attribute.value), иначе вызовите NoBarFunction (attribute.value)
  3. Если мне нужно обрабатывать каждый атрибут Child по-разному в зависимости от их имени (например, заполнять набор переменных значениями), является ли единственной опцией if-else для Attribute.Name внутри блока foreach (Attribute)?

Правильно ли я полагаю, что атрибут, у которого нет пространства имен "http://bar", фактически находится в некотором пространстве имен по умолчанию (а не в http://foo) в отличие от элементов, которые наследуют пространство имен родителя, если они не определены?

у меня есть:

IEnumerable<XElement> children = root.Elements("Child");
// How do I test the count? And get each Child
foreach (XAttribute attribute in child.Attributes())
{
   if (attribute.Name.Namespace.ToString() == "http://bar")
   {
BarFunction(attribute.Value);
   }
   else //Default Namespace
   {
      NoBarFunction(attribute.Value);
   }
}

Ответы [ 2 ]

0 голосов
/ 28 апреля 2011

API: Расширения. GetSchemaInfo

Думая из коробки, вы хотите знать, в какой схеме был объявлен атрибут (или элемент или ...).

В роли «чтения XML» эта схема будет проверять этот узел.

При проверке жаргона анализатора эта информация является частью PVSI ( Информационный набор схемы после проверки ). Вы можете получить эту информацию, позвонив, например,

public static void Validate(
    this XDocument source,
    XmlSchemaSet schemas,
    ValidationEventHandler validationEventHandler,
    bool addSchemaInfo
)

С addSchemaInfo, установленным в true .

Если addSchemaInfo имеет значение true, этот метод заполняет дерево XML набором данных после проверки схемы (PSVI).

Существует два шага для заполнения дерева XML с помощью PSVI.

  1. Сначала добавляется аннотация ко всем узлам дерева, чтобы можно было вызывать Extensions.GetSchemaInfo или Extensions.GetSchemaInfo для элемента или атрибута в дереве.

  2. Во-вторых, элементы и атрибуты по умолчанию, определенные в XSD, добавляются в дерево XML. Вызвав один из методов GetSchemaInfo, вы можете определить, был ли определенный элемент или атрибут добавлен из XSD в качестве элемента или атрибута по умолчанию.

0 голосов
/ 28 апреля 2011

Использование LINQ будет наиболее эффективным способом. Что-то вроде (по памяти):

IEnumerable<XElement> results = root.Elements("child").Where(el => el.Children.Count == 2)

А затем выполните проверку на results, чтобы увидеть, что такое пространство имен, и затем выполните метод для этого / этих XElement (s). Это также может быть сделано в LINQ с использованием синтаксиса, аналогичного приведенному выше.

Для пункта 3 вы могли бы использовать блок switch, который, вероятно, был бы более подходящим, хотя решение об архитектуре решать вам. Например. если элементы представляют собой набор предопределенных значений, то вы также можете использовать LINQ для заполнения ваших переменных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...