Как анализировать XML (используя XELement) с несколькими пространствами имен?

Я получаю следующий запрос Xresponse после разбора XML-документа:

<didl-lite xmlns="urn:schemas-upnp-org:metadata-1-0/DIDL-Lite/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:upnp="urn:schemas-upnp-org:metadata-1-0/upnp/" xmlns:dlna="urn:schemas-dlna-org:metadata-1-0/">
<item id="1182" parentid="40" restricted="1"> 
<title>Hot Issue</title> 
</item> 
</didl-lite>

В соответствии с предыдущим потоком. Когда в документе есть пространство имен по умолчанию, вы должны проанализировать его, как если бы оно было именованным пространством имен. Например.

XNamespace ns = "urn:schemas-upnp-org:metadata-1-0/DIDL-Lite/"; 
var xDIDL = xResponse.Element(ns + "DIDL-Lite");

Но в моем случае у меня есть четыре разных пространства имен. Я не получаю никаких результатов после использования следующего запроса, я получаю ответ, не получая никаких результатов:

XNamespace dc = "http://purl.org/dc/elements/1.1/";
 var vAudioData = from xAudioinfo in xResponse.Descendants(ns + "DIDL-lite").Elements("item")
 select new RMSMedia
 {
 strAudioTitle = ((string)xAudioinfo.Element(dc + "title")).Trim(),
};

Я понятия не имею, что происходит, когда я новичок в этом. Пожалуйста, помогите

2 ответа

Это потому, что ваш элемент item находится в вашем пространстве имен ns. Использование: -

XNamespace dc = "http://purl.org/dc/elements/1.1/";
XName didl = ns + "DIDL-lite";
XName item = ns + "item";
XName title = dc + "title";
var vAudioData = from xAudioinfo in xResponse.Descendants(didl).Elements(item)
select new RMSMedia
{
 strAudioTitle = ((string)xAudioinfo.Element(title)).Trim(),
};

В этих случаях я стараюсь создать себе частный класс для хранения набора XNames Мне нужно упростить код запроса.


Вы не получаете никаких результатов, потому что используете неправильное пространство имен. Все элементы без префикса находятся в пространстве имен urn:schemas-upnp-org:metadata-1-0/DIDL-Lite/.

Элементы в пространстве имен http://purl.org/dc/elements/1.1/ имеют префикс dc: в документе xml. Фрагмент не показывает никаких элементов, поэтому вам нужно рассказать, какие элементы вы ищете.

Например - задан следующий xml:

<didl-lite xmlns="urn:schemas-upnp-org:metadata-1-0/DIDL-Lite/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:upnp="urn:schemas-upnp-org:metadata-1-0/upnp/" xmlns:dlna="urn:schemas-dlna-org:metadata-1-0/">
<item id="1182" parentid="40" restricted="1"> 
<title>Hot Issue</title> 
<dc:title>Purl Title</dc:title>
</item> 
</didl-lite>

И также учитывая предположение, что вы хотите получить оба заголовка, следующий код должен содержать нужные результаты:

XNamespace dc= "http://purl.org/dc/elements/1.1/";
XNamespace ns = "urn:schemas-upnp-org:metadata-1-0/DIDL-Lite/";
var result = xAudioinfo.Descendants(ns + "title"); // 
var result2 = xAudioinfo.Descendants(dc + "title"); //

licensed under cc by-sa 3.0 with attribution.