3

解析 XML 文档后,我得到以下 Xresponse:

 <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(),
};

我不知道发生了什么,因为它是新手。请帮忙

4

2 回答 2

3

您没有得到任何结果,因为您使用了错误的命名空间。所有没有前缀的元素都在命名空间中urn:schemas-upnp-org:metadata-1-0/DIDL-Lite/

命名空间中的项目在xml 文档中http://purl.org/dc/elements/1.1/带有前缀。dc:该片段不显示任何项目,因此很难说出您要查找的元素。

例如 - 给定以下 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>
于 2010-03-22T10:13:58.827 回答
3

这是因为您的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(),
};

在这些情况下,我倾向于为自己创建一个私有类来保存我需要简化查询代码的一组 XName。

于 2010-03-22T10:14:46.737 回答