如何跳过使用 xmlTextReader 关闭 HTML 标签



我是学习libxml2的新手。每当我找到特定的 HTML 标记时,我都需要采取行动(在下面的简化示例中,该操作std::cout(。下面的程序在遇到与指定字符串 ("B"( 匹配的开始和结束标记时都会执行此操作。但是,我只想在找到开始标签后采取行动。如何做到这一点?我无法从 libxml2 文档中找到/理解是否有办法区分开始和结束标签,也找不到类似的 SO 问题。

守则:

#include <iostream>
#include <libxml/xmlreader.h>
int main( int argc, char* argv[] )
{
  int ret;
  xmlTextReaderPtr r = xmlNewTextReaderFilename("foo.xml");
  if ( !r )
  {
    return -1;
  }
  ret = xmlTextReaderRead( r );
  while ( 1 == ret )
  {
    if ( std::string("B") == (const char*)xmlTextReaderConstName( r ) )
    {
      std::cout << "Found desired tag" << std::endl;
    }
    ret = xmlTextReaderRead( r );
  }
  if ( r )
  {
    xmlFreeTextReader( r );
  }
  return 0;
}

编译如下

>g++ --version
g++ (GCC) 4.8.3 20140911 (Red Hat 4.8.3-7)
Copyright (C) 2013 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
>g++ -lxml2 -I/usr/include/libxml2 main.cpp

使用此 XML 运行

<?xml version="1.0" encoding="ISO-8859-1"?>
<A version="02.00.00" priority="0" reliable="false">
 <B attr1="Type_B" attr2="usb" attr3="600">
  <C/>
  <D/>
 </B>
</A>

结果在此输出中

>./a.out 
Found desired tag
Found desired tag

而我希望"找到所需的标签"只输出一次,即仅在遇到开始<B> HTML 标签时。

您可以使用 xmlTextReaderNodeType(reader( 来确定读取器当前所在的节点的"类型",如此处或 xmlreader.h 中的 xmlReaderType 枚举中定义。

在这种情况下,您需要区分XML_READER_TYPE_ELEMENT和XML_READER_TYPE_END_ELEMENT(忽略后者(。

最新更新