Элемент XML и пространство имен - PullRequest
3 голосов
/ 21 сентября 2009

У меня есть следующий метод для разбора XMLElements:

DisplayMessages(XElement root)
{
  var items = root.Descendants("Item");
  foreach (var item in items)
  {
     var name = item.Element("Name");
     ....
  }
}

В режиме отладки я могу видеть корень в виде XML следующим образом:

<ItemInfoList>
  <ItemInfo>
    <Item>
      <a:Name>item 1</a:Name>
      ...
    <Item>
    ...

и имя переменной равно нулю (я ожидаю получить "элемент 1"). Я пытался использовать «a: имя», но это вызвало исключение («символ: нельзя использовать в имени»). Я не уверен, должен ли я установить пространство имен в корневом XElelement или нет. Все узлы xml под root должны находиться в одном пространстве имен.

Я новичок в XElement. В моих кодах item.Element ("Name") получит значение значения дочернего узла "Name", верно?

Ответы [ 4 ]

4 голосов
/ 21 сентября 2009

Вам необходимо использовать имена элементов, которые включают пространство имен. Попробуйте это:

static void DisplayMessages(XElement root)
{
    var items = root.Descendants(root.GetDefaultNamespace() + "Item");
    foreach (var item in items)
    {
        var name = item.Element(item.GetNamespaceOfPrefix("a") + "Name");
        Console.WriteLine(name.Value);
    }
}

Обратите внимание, что оператор + перегружен для класса XNamespace, чтобы сделать код короче: Оператор XNamespace.Addition .

3 голосов
/ 21 сентября 2009

Вам необходимо определить пространство имен "a" в корневом элементе:

<Root a:xmlns="http:///someuri.com">
...
</Root>

Затем вы можете выбрать элемент в пространстве имен не по умолчанию, используя этот синтаксис в LINQ to XML:

XNamespace a = "http:///someuri.com"; // must match declaration in document
...
var name = item.Element(a + "Name");

EDIT:

Чтобы получить пространство имен по умолчанию:

XNamespace defaultNamespace = document.Root.GetDefaultNamespace();
// XNamespace.None is returned when default namespace is not explicitly declared

Чтобы найти другие объявления пространства имен:

var declarations = root.Attributes().Where(a => a.IsNamespaceDeclaration);

Обратите внимание, что пространства имен могут быть объявлены в любом элементе, поэтому вам нужно будет рекурсивно искать все элементы в документе, чтобы найти все объявления пространства имен. На практике, хотя это обычно делается в корневом элементе, если вы можете контролировать, как генерируется XML, это не будет проблемой.

0 голосов
/ 21 сентября 2009

Если вы работаете с данными XML, которые содержат пространства имен, вам необходимо объявить эти пространства имен. (Это общее замечание, которое я сделал, хотя кажется, что трудно «просто посмотреть» на данные, которые вы не знаете).

Вам необходимо объявить XNamespace для ваших XElements, как в следующих примерах MSDN: Element () , XName

0 голосов
/ 21 сентября 2009

Вам необходимо создать XNames с ненулевым пространством имен. Для этого вам нужно создать пространство XName и добавить имя элемента, см. Создание XName в пространстве имен .

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