使用 Tinyxml , TinyXpath 在 C ++ 中是否有办法,这样,字符串包含:
<ns:abcd>
<ns:defg>
<ns:hijk>
</ns:hijk>
</ns:defg>
</ns:abcd>
转换为
<abcd>
<defg>
<hijk>
</hijk>
</defg>
</abcd>
编辑:
我使用的是Tinyxml和Tinyxpath。
我的工作流程是:
a)使用TinyXML
创建一个dom-treeb)将dom-tree传递给Tinyxpath以进行xpath评估
要添加名称空间删除,我使用了以下功能:
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)使用RemoveAllNamespaces(domtree.Root() )
c)将modified-dom-tree传递给Tinyxpath以进行xpath评估
答案 0 :(得分: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>
请注意,在elements / attribute上,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>
答案 1 :(得分:1)
好的,在回答编辑过的问题时,请注意几点:
实际上并不处理命名空间(考虑xmlns="http://blabla.com/uri"
样式默认命名空间),但这实际上是一个TinyXml限制(eek):
此外,TinyXML无法处理XML命名空间。合格的元素或属性名称保留其前缀,因为TinyXML不会将前缀与名称空间匹配。
它不会处理属性(也可以是合格的)
这就是我快速做的事情。 dirty(假设您已经在使用TIXML_USE_STL):
static inline std::string RemoveNs(std::string const& xmlName)
{
return xmlName.substr(xmlName.find_last_of(":") + 1);
}
void RemoveAllNamespaces(TiXmlNode* node)
{
assert(node);
if (auto element = node->ToElement()) {
element->SetValue(RemoveNs(element->Value()));
for (auto attr = element->FirstAttribute(); attr; attr = attr->Next())
attr->SetName(RemoveNs(attr->Name()));
for (auto child = node->IterateChildren(nullptr); child; child = element->IterateChildren(child))
RemoveAllNamespaces(child);
}
}
在 my MSVC test 上打印
<?xml version="1.0" standalone="no"?>
<!-- Our: to do list data -->
<ToDo a="http://example.org/uri1">
<!-- Do I need: a secure PDA? -->
<Item priority="1" distance="close">Go to the<bold>Toy store!</bold></Item>
<Item priority="2" distance="none">Do bills</Item>
<Item priority="2" distance="far & back">Look for Evil Dinosaurs!</Item>
</ToDo>