1

TinyxmlTinyXpathを使用してC++に方法はあります?

<ns:abcd>
  <ns:defg>
    <ns:hijk>
    </ns:hijk>
  </ns:defg>
</ns:abcd>

に変換します

<abcd>
  <defg>
    <hijk>
    </hijk>
  </defg>
</abcd>

編集:

Tinyxml と Tinyxpath を使用していました。

私のワークフローは次のとおりです。

a) TinyXML を使用して dom-tree を作成する

b) xpath 評価のために dom-tree を Tinyxpath に渡す

名前空間の削除を追加するには、次の関数を使用しました:

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-tree を作成する

b) を使用して、domtree から名前空間を削除しますRemoveAllNamespaces(domtree.Root() )

c) xpath 評価のために modified-dom-tree を Tinyxpath に渡す

4

2 に答える 2

2

ここでは 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>
于 2014-09-13T19:46:02.163 に答える