c++ - 有没有办法使用 C++/Boost 或使用其他库从 xml 标记中删除 namespace

标签 c++ xml namespaces tinyxml tinyxpath

C++ 中有没有一种方法,使用 TinyxmlTinyXpath ,这样一个 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() )

从 domtree 中移除命名空间

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/

相关文章:

namespaces - Tcl - 将命名空间拆分为多个文件

c++ - 如何初始化一个以priority_queue为值的map与priority_queue的比较对象?

c++ - IEEE 浮点实现、精度和近似值的累积

c++ - 在我的主文件中全局创建 C++ 类实例

java - Java中如何使用XPath检查节点是否具有一个或多个特定属性?

使用 Powershell 解析 XML

php - 命名空间在 Laravel 中不起作用

node.js - 如何删除 io.socket 命名空间事件?

c++ - 文件内容损坏的原因

python - 使用 Python 操作 XML