代码之家  ›  专栏  ›  技术社区  ›  Tony The Lion

使用带有tinyxpath和tinyxml的xpath获取属性

  •  2
  • Tony The Lion  · 技术社区  · 14 年前

    我正在尝试编写一个函数,它将使用带有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 回复  |  直到 14 年前
        1
  •  1
  •   Mads Hansen    14 年前

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

    • 如果试图评估属性是否为 在任何地方 在文档中,然后必须更改XPath中的坐标轴。

    • 如果试图评估属性是否附加到 特定元素 ,然后需要更改上下文(即,不是document元素,而是 Element2 元素)。

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

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

    2. 如果您将上下文更改为 要素2 元素,而不是文档元素,然后 @Myattribute 会被找到的。

        2
  •  1
  •   Paride    14 年前

    如果您知道您的节点是“string”类型,则可以直接使用s_compute_xpath()函数。 例子:

    TiXmlString ts = proc.S_compute_xpath();
    

    然后你可以转换 ts 在“规范”字符串中使用 ts.c_str() . 它可以像处理元素那样处理属性,但是如果捕获元素,则可以在xpath表达式的底部添加函数text(),例如

    xpath_processor xproc(doc.RootElement(),"/Documento/Element2/text()");
    

    另外,我认为您只需要包含一个“根”类型的节点。 您的XML必须看起来像

    <Documento>
            <Test></Test>
            <Element>Tony</Element>
            <Element2 Myattribute="12">Tb</Element2>
    </Documento>
    

    巴黎。