Как работать с XDocument без явного указания Namespace
От: Аноним  
Дата: 06.10.10 12:33
Оценка:
Получаю XML , Элементы которого находятся в некотором namespace:

<data xmlns="namespace_мать_его" >
  <Name>имя</Name>
  <ID/>
</data>


Мне нужно работать с документом обычным образом, без постоянного указания namespace:
XDocument xDoc = XDocument.Parse(inputString);
String name = xDoc.Root.Element("Name").Value;
// дальнейшая обработка


Как это делается?
Re: Как работать с XDocument без явного указания Namespace
От: _FRED_ Черногория
Дата: 06.10.10 12:55
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Получаю XML , Элементы которого находятся в некотором namespace:

А>Мне нужно работать с документом обычным образом, без постоянного указания namespace:
А>Как это делается?

А namespace-то вам известен? Дело просто в экономии или в чём-то другом?
Help will always be given at Hogwarts to those who ask for it.
Re[2]: Как работать с XDocument без явного указания Namespac
От: Аноним  
Дата: 06.10.10 13:04
Оценка:
_FR>А namespace-то вам известен?

Namespace не известен, но его можно извлечь:
XNamespace xNam = xDoc.Root.Name.Namespace;

_FR>Дело просто в экономии или в чём-то другом?

Да, меня честно раздражает запись вида:
String name = xDoc.Root.Element(xNam + "Name").Value;
Re[2]: Как работать с XDocument без явного указания Namespac
От: Аноним  
Дата: 06.10.10 13:20
Оценка: 13 (1)
_FR>А namespace-то вам известен? Дело просто в экономии или в чём-то другом?

Так как стандартных средств не нашел, вывернулся при помощи методов расширений:

public static class Extensions {
    public static XElement ToX(this XElement xParent, String name) {
        return xParent.Element(xParent.Name.Namespace + name);
    }

    public static IEnumerable<XElement> ToXs(this XElement xParent, String name) {
        return xParent.Elements(xParent.Name.Namespace + name);
    }
}
Re[3]: Как работать с XDocument без явного указания Namespac
От: _FRED_ Черногория
Дата: 06.10.10 13:36
Оценка:
Здравствуйте, Аноним, Вы писали:

_FR>>А namespace-то вам известен?

А>Namespace не известен, но его можно извлечь:
А>XNamespace xNam = xDoc.Root.Name.Namespace;

_FR>>Дело просто в экономии или в чём-то другом?
А>Да, меня честно раздражает запись вида:
А>String name = xDoc.Root.Element(xNam + "Name").Value;

var xname = doc.Root.Name.Namespace.GetName("Name");
var name = (string)doc.Root.Element(xname);


Ибо, хардкодить строки по-любому не здорово, а заводить константу типа строки или переменную типа XName с синтаксической точки зрения не очень важно.

Другой вариант, полухакерский, пройтись по всему документы и заменить имя на только локальное имя.

ИМХО, лучше приучивать себя к тому, что namespace есть неотъемлемая часть имени и если он задан, то не спроста.
Help will always be given at Hogwarts to those who ask for it.
Re[3]: Как работать с XDocument без явного указания Namespac
От: _FRED_ Черногория
Дата: 06.10.10 13:38
Оценка:
Здравствуйте, Аноним, Вы писали:

_FR>>А namespace-то вам известен? Дело просто в экономии или в чём-то другом?

А>Так как стандартных средств не нашел, вывернулся при помощи методов расширений:

А>public static class Extensions {
А>    public static XElement ToX(this XElement xParent, String name) {
А>        return xParent.Element(xParent.Name.Namespace + name);
А>    }

А>    public static IEnumerable<XElement> ToXs(this XElement xParent, String name) {
А>        return xParent.Elements(xParent.Name.Namespace + name);
А>    }
А>}


Вполне здраво для конкретного сценария. Только имена бы подобрать попонятнее, проверку на null и таки не строки конкатенировать, а получать нормальный XName и с ним лезть в Element(s).
Help will always be given at Hogwarts to those who ask for it.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.