Как проанализировать XML (используя XELement) с несколькими пространствами имен? - PullRequest
3 голосов
/ 22 марта 2010

Я получаю следующий 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> 

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

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 ]

3 голосов
/ 22 марта 2010

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

3 голосов
/ 22 марта 2010

Вы не получаете никаких результатов, потому что используете неправильное пространство имен. Все элементы без префикса находятся в пространстве имен 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"); // <title></title>
var result2 = xAudioinfo.Descendants(dc + "title"); // <dc:title></dc:title>
...