2009-09-21 10 views
3

У меня есть следующий метод синтаксического анализа XMLElements:элемента XML и пространство имен

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: Name», но вызвал исключение («символ: нельзя использовать в имени»). Я не уверен, что мне нужно задать пространство имен в корневом XElelement или нет. Все узлы xml под root должны находиться в одном и том же пространстве имен.

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

+0

Является ли 'root' здесь фактическим корневым узлом XML? I.e., является ли ваш XML-фрагмент полным документом XML, который вы получаете? Если да, то это просто недействительный XML. –

ответ

0

Вам нужно создать XNames, у которых есть пустое пространство имен. Для этого вам нужно создать XNamespace и добавить имя элемента, см. Creating an XName in a Namespace.

3

Вам нужно определить «в» пространство имен в корневом элементе:

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

Затем вы можете выбрать элемент в не-пространство имен по умолчанию, используя следующий синтаксис в LINQ к 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

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

Вы должны объявить XNamespace для XElements, так как в этих образцах MSDN: Element(), XName

4

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

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 Operator.

Смежные вопросы