使用XPath和TinyXPath&获取属性TinyXML的

时间:2010-10-22 07:31:41

标签: c++ xml xpath

我正在尝试编写一个函数,它将使用带有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>

2 个答案:

答案 0 :(得分:1)

如果您只使用@myattribute,它将查找附加到上下文节点的属性(在本例中为文档元素)。

  • 如果您正在尝试评估文档中属性 ,那么您必须在XPATH中更改轴。

  • 如果您正在尝试评估属性是否附加到特定元素,那么您需要更改上下文(即不是文档元素,而是Element2元素)。

以下是两种可能的解决方案:

  1. 如果您使用XPATH表达式//@Myattribute,它将扫描整个文档以查找该属性。

  2. 如果您将上下文更改为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。