libxml ++ TextReader; 跳过节点

学者

我正在使用libxml ++来解析相当大的XML文件,因此无法使用DOM。

说我有一个XML文件,如:

<?xml version="1.0"?>

<root>

  <book name="book1">
    <chapter name="chapter1">
      #Pages
    </chapter>
    <chapter name="chapter2">
      #Pages
    </chapter>
  </book>

  <book name="book2">
    <chapter name="chapter1">
      #Pages
    </chapter>
    <chapter name="chapter2">
      #Pages
    </chapter>
  </book>

  <book name="book3">
    <chapter name="chapter1">
    </chapter>
      #Pages
    <chapter name="chapter2">
      #Pages
    </chapter>
  </book>

</root>

有没有一种方法可以遍历所有书籍,而不必使用TextReader处理嵌套节点?一般而言,使用SAX解析器可以吗?

编辑:移动解决方案来回答。

学者

我可能找到了(部分)解决方案。

read()读取下一个节点并因此进入“更深”的层,而next()跳至当前深度的下一个节点。两次调用read()会将读者移至第一本书的开始标记(深度1)。现在,调用next()会使阅读器跳到深度为1的下一个节点,在本例中为关闭标签。现在可以通过调用next()遍历所有书籍,因为如果不再有深度为1的节点,它将返回false。

不幸的是,没有将阅读器移到树上的选项,因此,如果您在循环内调用read()并移至更深的一层,则next()将跳至该层的下一个节点,因此可能不会在大多数情况下是令人满意的答案。


另一种方法是在读取器上调用get_current_node(),然后使用get_children()检索直接子节点的列表。在此示例中,可以调用read()将阅读器移至根节点,然后分别调用get_current_node()和get_children并迭代生成的“ book”节点列表。

这似乎仅适用于小型文件,因为将get_children()调用到具有许多子节点的节点可能会导致列表缩短,只显示所有子节点的一小部分


我发现一种可能的解决方法是导航到所需的深度(如上所述),通过调用next()遍历该深度的节点,并在每次循环之后,通过在TextReader上调用expand()初始化一个新的Node-Object,这将扩展当前节点及其所有子树。这样,您可以通过访问新节点来在子树上工作,而无需更改TextReader-Object。

但是,要小心。除非您调用free_wrapper(),否则不会删除新节点的C ++包装器。

从文档中:

C ++包装器不会被删除。使用此方法(expand())会导致内存泄漏,除非您调用xmlpp :: Node :: free_wrappers(),但应用程序不打算调用它。


请注意,这是根据我自己的观察得出的,因为功能文档非常稀疏或不完整。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Java

用sax跳过节点

来自分类Dev

Euca 5 Ansible 安装跳过节点操作

来自分类Dev

使用ReadElementContentAs后,c#XMLReader会跳过节点

来自分类Dev

Perl XML:LibXML-动态节点

来自分类Dev

解析出节点和属性XML :: LibXML

来自分类Dev

C#内存到TextReader

来自分类Dev

使用XML:libXML抛出错误添加新节点

来自分类Dev

如何使用XML :: LibXML列出XML节点属性?

来自分类Dev

libxml2:相对于子节点的xpath

来自分类Dev

perl XML :: LibXML获取直接子文本节点内容

来自分类Dev

libXML:检查节点是否已经取消链接并释放

来自分类Dev

有没有办法使用iterparse lxml跳过节点/元素?

来自分类Dev

将TextReader流式传输到文件

来自分类Dev

将新节点添加到一组现有节点(Perl XML :: LibXML)

来自分类Dev

在 Github Pages 上上传 React 应用程序:如何跳过节点模块文件夹的上传?

来自分类Dev

OSMNX最短路径-如果无法访问节点,如何跳过节点并采取下一个最近节点

来自分类Dev

使用XML :: LibXML编写XML时如何创建要追加的节点?

来自分类Dev

XML :: LibXML问题发现具有命名空间的XML节点

来自分类Dev

LibXML2:如何从节点反向查找XPath表达式

来自分类Dev

Perl LIBXML:使用具有属性的findnodes到达xml文件中的节点

来自分类Dev

需要具有相同名称的多个同级节点的值:XML :: LibXML

来自分类Dev

如何使用Perl的XML :: LibXML在XDM文档中找到特定的节点?

来自分类Dev

Perl XML LibXML 用 xsd 架构上的另一个节点替换一个节点

来自分类Dev

C#未处理的异常:无法从关闭的Textreader读取

来自分类Dev

通过节点获取FTP上传进度

来自分类Dev

如何通过节点运行testcafe

来自分类Dev

不断检查子弹是否接触过节点

来自分类Dev

如何在Perl中使用XML :: LibXML访问处于同一级别的具有相同标签的节点?

来自分类Dev

为什么libxml不允许我创建具有base64文本内容的节点?

Related 相关文章

  1. 1

    用sax跳过节点

  2. 2

    Euca 5 Ansible 安装跳过节点操作

  3. 3

    使用ReadElementContentAs后,c#XMLReader会跳过节点

  4. 4

    Perl XML:LibXML-动态节点

  5. 5

    解析出节点和属性XML :: LibXML

  6. 6

    C#内存到TextReader

  7. 7

    使用XML:libXML抛出错误添加新节点

  8. 8

    如何使用XML :: LibXML列出XML节点属性?

  9. 9

    libxml2:相对于子节点的xpath

  10. 10

    perl XML :: LibXML获取直接子文本节点内容

  11. 11

    libXML:检查节点是否已经取消链接并释放

  12. 12

    有没有办法使用iterparse lxml跳过节点/元素?

  13. 13

    将TextReader流式传输到文件

  14. 14

    将新节点添加到一组现有节点(Perl XML :: LibXML)

  15. 15

    在 Github Pages 上上传 React 应用程序:如何跳过节点模块文件夹的上传?

  16. 16

    OSMNX最短路径-如果无法访问节点,如何跳过节点并采取下一个最近节点

  17. 17

    使用XML :: LibXML编写XML时如何创建要追加的节点?

  18. 18

    XML :: LibXML问题发现具有命名空间的XML节点

  19. 19

    LibXML2:如何从节点反向查找XPath表达式

  20. 20

    Perl LIBXML:使用具有属性的findnodes到达xml文件中的节点

  21. 21

    需要具有相同名称的多个同级节点的值:XML :: LibXML

  22. 22

    如何使用Perl的XML :: LibXML在XDM文档中找到特定的节点?

  23. 23

    Perl XML LibXML 用 xsd 架构上的另一个节点替换一个节点

  24. 24

    C#未处理的异常:无法从关闭的Textreader读取

  25. 25

    通过节点获取FTP上传进度

  26. 26

    如何通过节点运行testcafe

  27. 27

    不断检查子弹是否接触过节点

  28. 28

    如何在Perl中使用XML :: LibXML访问处于同一级别的具有相同标签的节点?

  29. 29

    为什么libxml不允许我创建具有base64文本内容的节点?

热门标签

归档