在 C++ 中有没有一种方法,使用 Tinyxml , TinyXpath ,这样一个 string 包含:
<ns:abcd>
<ns:defg>
<ns:hijk>
</ns:hijk>
</ns:defg>
</ns:abcd>
转换为
<abcd>
<defg>
<hijk>
</hijk>
</defg>
</abcd>
编辑:
我使用的是 Tinyxml 和 Tinyxpath。
我的工作流程是:
a) 使用 TinyXML 创建一个 dom 树
b) 将 dom-tree 传递给 Tinyxpath 以进行 xpath 评估
为了添加 namespace 删除,我使用了以下函数:
void RemoveAllNamespaces(TiXmlNode* node)
{
TiXmlElement* element = node->ToElement();
if(!element){
return;
}
std::string elementName = element->Value();
std::string::size_type idx = elementName.rfind(':');
if(idx != std::string::npos)
{
element->SetValue(elementName.substr( idx + 1).c_str());
}
TiXmlNode* child = element->IterateChildren(NULL);
while(child)
{
RemoveAllNamespaces(child);
child = element->IterateChildren(child);
}
}
因此工作流程更改为:
a) 使用 TinyXML 创建一个 dom 树
b) 使用 RemoveAllNamespaces(domtree.Root() )
c) 将 modified-dom-tree 传递给 Tinyxpath 以进行 xpath 评估
最佳答案
我会在这里使用 XSLT 转换:
<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output omit-xml-declaration="yes" indent="yes" />
<xsl:template match="*">
<xsl:element name="{name()}" namespace=""><xsl:apply-templates select="node()|@*"/></xsl:element>
</xsl:template>
<xsl:template match="@*">
<xsl:attribute name="{name()}" namespace=""><xsl:value-of select="."/></xsl:attribute>
</xsl:template>
</xsl:stylesheet>
请注意,在元素/属性上,namespace=""
会清除命名空间。您也可以指定不同的命名空间。
和input.xml
一样
<?xml version="1.0"?>
<ns:abcd xmlns:ns="http://bla/bla">
<ns:defg attr="value">
<ns:hijk>
</ns:hijk>
</ns:defg>
</ns:abcd>
xsltproc xform.xsl input.xml
打印:
<abcd>
<defg attr="value">
<hijk>
</hijk>
</defg>
</abcd>
关于c++ - 有没有办法使用 C++/Boost 或使用其他库从 xml 标记中删除 namespace ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25822161/