如何解析具有多个命名空间的XML(使用XELement)?

如何解析具有多个命名空间的XML(使用XELement)?

问题描述:

我得到的followinng Xresponse解析XML文档后:如何解析具有多个命名空间的XML(使用XELement)?

<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"); 

但在我的情况下,我有四个不同的名称空间。我使用下面的查询后,我没有得到任何结果,我得到的反应,而不是Yeilding任何结果:

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

我不知道怎么回事因为是新来的吧。请帮助

这是因为您的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集合。

+0

谢谢Ton Obaliz和Anthony的专家建议。 Itz现在工作 – Simsons

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

命名空间http://purl.org/dc/elements/1.1/中的项目前缀为xml文档中的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> 

而且还考虑到要同时检索标题下面的代码应该yiedl结果您正在寻找的假设:

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>