我正在尝试编写一个函数,它将使用带有TinyXPath库的XPath获取文档中一组XML节点的属性,但我似乎无法弄明白。我发现TinyXPath上的文档也不是很有启发性。有人可以帮助我吗?
std::string XMLDocument::GetXPathAttribute(const std::string& attribute)
{
TiXmlElement* Root = document.RootElement();
std::string attributevalue;
if (Root)
{
int pos = attribute.find('@'); //make sure the xpath string is for an attribute search
if (pos != 0xffffffff)
{
TinyXPath::xpath_processor proc(Root,attribute.c_str());
TinyXPath::expression_result xresult = proc.er_compute_xpath();
TinyXPath::node_set* ns = xresult.nsp_get_node_set(); // Get node set from XPath expression, however, I think it might only get me the attribute??
_ASSERTE(ns != NULL);
TiXmlAttribute* attrib = (TiXmlAttribute*)ns->XAp_get_attribute_in_set(0); // This always fails because my node set never contains anything...
return attributevalue; // need my attribute value to be in string format
}
}
}
用法:
XMLDocument doc;
std::string attrib;
attrib = doc.GetXPathAttribute("@Myattribute");
示例XML:
<?xml version="1.0" ?>
<Test />
<Element>Tony</Element>
<Element2 Myattribute="12">Tb</Element2>
答案 0 :(得分:1)
如果您只使用@myattribute
,它将查找附加到上下文节点的属性(在本例中为文档元素)。
如果您正在尝试评估文档中属性 ,那么您必须在XPATH中更改轴。
如果您正在尝试评估属性是否附加到特定元素,那么您需要更改上下文(即不是文档元素,而是Element2
元素)。
以下是两种可能的解决方案:
如果您使用XPATH表达式//@Myattribute
,它将扫描整个文档以查找该属性。
如果您将上下文更改为Element2
元素而不是文档元素,则会找到@Myattribute
。
答案 1 :(得分:1)
如果您知道您的节点是“String”类型,则可以直接使用S_compute_xpath()函数。 例如:
TiXmlString ts = proc.S_compute_xpath();
然后,您可以使用ts
在“规范”字符串中转换ts.c_str()
。
它既可以使用属性,也可以使用元素,但是如果捕获元素,则可以在XPATH表达式的底部添加函数text(),例如
xpath_processor xproc(doc.RootElement(),"/Documento/Element2/text()");
此外,我认为你必须只包含一个“root”类型的节点。 你的XML必须看起来像
<Documento>
<Test></Test>
<Element>Tony</Element>
<Element2 Myattribute="12">Tb</Element2>
</Documento>
Paride。