如何从scala.xml获取命名空间节点?

时间:2013-11-22 02:22:52

标签: scala xml-namespaces

查看RSS,像Craigslist(http://chambana.craigslist.org/cta/index.rss)之类的东西给出了两个命名空间的节点。

类似的东西:

<item rdf:about="http://dallas.craigslist.org/sdf/cto/4206532641.html">
<title>
<![CDATA[ 1965 Pontiac Tempest GTO tribute ]]>
</title>
...tl;dr...
<dc:title>
<![CDATA[ 1965 Pontiac Tempest GTO tribute ]]>
</dc:title>
</item>

类似的东西:

(item \ "title").text

给出标题两次。你如何访问命名空间节点?

1 个答案:

答案 0 :(得分:4)

您需要过滤生成的NodeSeq

val unprefixedTitle = (item \ "title").filter(_.prefix == null)
val dublinCoreTitle = (item \ "title").filter(_.prefix == "dc")

每个过滤后的序列都包含一个元素。

如果您拥有整个文档(或至少具有命名空间声明的部分),您可以按名称空间而不是前缀进行过滤,这更加健壮:

val dublinCoreTitle = (item \ "title").filter(
  _.namespace == "http://purl.org/dc/elements/1.1/"
)

现在,即使您正在使用恰好将此命名空间映射到不同前缀的文档,您也将获得所需的元素。