【发布时间】:2016-01-01 13:21:16
【问题描述】:
我正在尝试在 R 中构建一个看起来像这样的 XML 结构。请注意默认命名空间、其他命名空间以及位于备用命名空间中的内部 Name 对象:
<?xml version = "1.0" encoding="UTF-8"?>
<sld xmlns="http://www.o.net/sld"
xmlns:ogc="http://www.o.net/ogc"
xmlns:se="http://www.o.net/se"
version="1.1.0" >
<layer>
<se:Name>My Layer</se:Name>
</layer>
</sld>
这段代码很接近,标签上的命名空间没问题,但根标签中没有默认命名空间:
require(XML)
makesimple = function(){
z = xmlTree("sld",
namespaces=list(
"ogc"="http://www.o.net/ogc",
"se"="http://www.o.net/se"),
attrs=list(version="1.1.0")
)
z$addNode("layer", close=FALSE)
z$setNamespace("se")
z$addNode("Name","My Layer")
z$closeTag()
z
}
> cat(saveXML(makesimple()))
给予
<?xml version="1.0"?>
<sld
xmlns:ogc="http://www.o.net/ogc"
xmlns:se="http://www.o.net/se"
version="1.1.0">
<layer>
<se:Name>My Layer</se:Name>
</layer>
</sld>
但是如果我添加一个默认的(未命名的)命名空间,那么为内部元素设置命名空间就没有任何作用。将上面的一行更改为:
z = xmlTree("sld",
namespaces=list("http://www.o.net/sld",
"ogc"="http://www.o.net/ogc",
"se"="http://www.o.net/se"),
attrs=list(version="1.1.0")
)
这给了我:
<?xml version="1.0"?>
<sld
xmlns="http://www.o.net/sld"
xmlns:ogc="http://www.o.net/ogc"
xmlns:se="http://www.o.net/se"
version="1.1.0">
<layer>
<Name>My Layer</Name>
</layer>
</sld>
它在根元素中的所有命名空间都是正确的,但是我想要的内部元素的命名空间已经消失了。
请注意,我开始使用 newXMLDoc 和 newXMLNode 函数处理此问题,直到我阅读了文档:
While the functions are available, their direct use is not encouraged. Instead, use ‘xmlTree’ as the functions need to be used within a strict regime to avoid corrupting C level structures.
我即将放弃使用package::XML 构建这些东西,而只是使用模板系统(可能是package::brew)构建它们。
【问题讨论】:
标签: xml r namespaces