问题标签 [pugixml]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
224 浏览

sorting - 我似乎无法在 pugixml 文档中交换并行节点/子树的位置......?

我需要在文档中的一个级别对大多数子节点进行重新排序。

该文档的结构看起来(简化)如下:

我现在正在使用 pugixml 来加载、解析、遍历和访问大型 xml 文件,并且我最终正在处理一个新的数据行序列。我知道我正在正确解析所有内容,并且查看重新排序结果,我可以看到读取和处理是正确的。经过我所有的优化和处理后的重新排序解决方案是一个按修改顺序排列的指标列表,例如上面示例的 { D,A,E,C,B }。所以现在我需要将它们重新排序为这个新顺序,然后将生成的 xml 输出到一个新文件中。实际数据大约16兆,有几百个数据元素行节点,每行有一百多个数据元素

我编写了一个例程来交换两个数据行,但我正在做的事情是在交换期间破坏 xml 结构的一致性。我确定我不理解 pugi 移动节点和/或使节点句柄无效的方式。

我创建并留出节点句柄——pugi::xml_node——到“表”级节点、“标题”行节点和“第一个数据”行节点,在上面的原始形式中是节点“数据行 A”。我知道这些句柄让我可以正确访问正确的数据——我可以在优化和重新排序计算期间暂停执行并查看它们,并检查行及其同级并查看输入顺序。

“标题行”始终是表的特定子项,“第一个数据行”始终是紧随“标题行”之后的兄弟。所以我在加载文件并检查它们的数据一致性时设置了这些。

我对 node::insert_copy_before 的理解是这样的:

我的理解是,具有所有子节点和属性的 node_to_be_copied_to_child_of_parent 的深度递归克隆将作为兄弟节点插入到 node_to_be_copied_nodes_next_sibling 之前,其中两者都是父节点的子节点。

显然,如果 node_to_be_copied_nodes_next_sibling 也是“第一个数据行”,那么第一个数据行的节点句柄在操作后可能仍然有效,但实际上不再是第一个数据节点的句柄。但是在文档上使用 insert_copy 是否会强制更新附近的单个节点句柄 - 或者不是 - 的更改?

所以让我们看一下我正在尝试制作的代码:

// 此时我知道我创建的所有句柄都指向预期的数据。

// 这就是我关心的地方。此副本是否按照我的要求执行,将第二个目标行的副本移动到表节点下的位置 // 作为 xmnNodeAfterFirstNode 之前的子节点?如果是这样,此操作是否会使数据行节点的其他句柄无效?// 一旦我们在兄弟列表中进行插入/复制,是否所有的赌注都结束了,或者该子列表中其他节点的句柄是否仍然有效?

// 显然,如果数据行节点的其他句柄已被第一个 insert_copy 无效,那么这些句柄就不再有用了...

// 这是我尝试在将原始数据行节点复制到新位置后删除它们

// 和以前一样,如果使用 insert_copy 方法导致许多句柄四处移动,那么我将无法基于标题的“已知”句柄来更新“第一个数据行节点” //句柄数据行节点。

正如我所说,这破坏了生成的 xml 的结构一致性。我可以保存它,但除了记事本之外什么都不会读取它。桌子最终有点乱码。如果我尝试使用自己的程序阅读它,阅读器会报告“元素不匹配”错误并拒绝加载它,这是可以理解的。

所以我做错了一件或多件事。这些是什么?

0 投票
0 回答
324 浏览

html-parsing - PugiXML 保留空白,但不保留 EOL

我正在将 html 转换为 xml,更改标签名称和其他内容,但我在保留空格方面遇到了问题。这就是我加载文件的方式:

但是如果我这样使用它,'\n' 和 '\r' 也会被保留。我不明白为什么,因为 parse_escapes 和 parse_eol 默认情况下是打开的。

parse_ws_pcdata_single,不适合我,因为我不想保留的空格有兄弟姐妹。

0 投票
1 回答
2499 浏览

c++ - 无法使用 node.value() 在 pugixml 中获取 XML 元素的值

我的 C++ 源代码中有以下简单的 XML 模板。在下面的代码块中,我需要获取<scannerID>and的值<subscannerID>。这两个元素都是 pugixml 文档根的子元素。

此代码部分给出如下所示的输出。我可以正确获取节点的名称,但未能检索到值。

输出:值是空字符串。

编辑以在答案中添加对方法的修改

但输出仍然相同。我在阅读文件时看到了一些不同的东西

0 投票
1 回答
2896 浏览

c++ - 如何使用pugixml解析获取具有相同节点名称的节点的节点数据?

对于具有相同子节点名称的节点的所有子节点,我得到相同的节点值。例如,在我的代码中,在所有情况下,我都将节点名称的节点数据值作为 ACHRA。我想获得正确的节点值。请指导。

这是我的代码:

XML 代码:


C++ 代码


我的输出是:

0 投票
1 回答
894 浏览

c++ - 使用 pugixml 和 rapidxml 移动(不复制)节点

我正在寻找一个支持 DOM 接口的 XML 库。性能对我来说很重要,所以我目前正在研究 rapidxml 和 pugixml。

问题是我的应用程序需要修改 DOM 树,包括移动节点。而且我看不到这样做的直接方法(无论是使用 rapidxml 还是使用 pugixml)。看来我需要复制/克隆节点,如果我要移动的子树很深,这可能会导致大量复制操作。

有没有更有效的方法(使用 rapidxml 或 pugixml)(例如交换指针等)?如果没有,是否有任何其他轻量级库允许这样做?

谢谢!

0 投票
2 回答
59 浏览

c++ - 将表单数据直接插入 PugiXML 文档

我正在尝试使用 pugiXML 从 VC++ 2010 中的表单插入数据。

问题是,每当我尝试输入数据时,都会收到此错误:

我用来插入数据的代码是这样的:

文档指出这些函数接受字符串参数,所以我不确定为什么会出现“预期的 char_t”错误。

0 投票
1 回答
1529 浏览

xml - pugixml没有加载文件

我正在尝试加载与 loadfile.cpp 位于同一目录中的“tree.xml”,该目录也有 pugixml.cpp、pugixml.hpp、pugiconfig.hpp。

我得到了结果:

我在这里遵循手册:http: //cdn.rawgit.com/zeux/pugixml/v1.4/docs/quickstart.html在“加载文档”下。

tree.xml 文档如下所示:

为什么文件加载不出来?我不知道出了什么问题。

0 投票
0 回答
366 浏览

c++ - pugixml - how to get the document from a contained node

I was wondering it there is a way to obtain the xml_document that contains a given xml_node. Looking at the API doc xml_node provides the method root() but the return type is xml_node instead of xml_document. Is there a way to work around this in order to get the document?

Thanks in advance.

0 投票
1 回答
1221 浏览

c++ - 使用 pugixml 在 Codeblocks (C++) 中打开 XML 文件

我一直在寻找如何使用代码块和库 pugixml 解析 xml 文件,但我尝试了不同的方法,但它仍然不起作用。

我必须解析的 XML 包含在一个图(房屋)上,我在 C++ 中的程序是使用结构来表示这个图。

XML 文件如下所示:

ETC...

C ++中的代码:(重要部分:))

请告诉我,代码中的错误可能是什么?它总是进入 if 条件,我的意思是,它不加载文件。谢谢!

0 投票
1 回答
716 浏览

c++ - 将 const char * 转换为非 const char*

我正在用 C++ 编写一个程序来比较两个大型 XML 文件,并创建一个包含更改的产品(节点)的标识符和更改的文件。为此,我正在使用pugixml

我现在是一名 PHP 开发人员,自从我使用 c++ 以来已经有一段时间了,所以我认为我忽略了一些微不足道的事情,但是经过数小时的在线搜索后,我仍然没有找到解决我的问题的方法,即:

child_value 函数简单地给出元素标签之间的值,返回一个 const char *。我想要做的是将所有值放入一个数组中,并将它们与所有其他产品的值(它们在一个类似的数组中)进行比较。

转到下一个产品时会出现问题,我需要覆盖数组中的值,我认为这是我得到的分段错误的根源。所以我的问题是:

我需要使用该 const char * 进行比较,但我需要覆盖这些值以便进行下一次比较,最好的方法是什么?我已经尝试过 strcpy、const_cast(如下面的示例代码)和许多其他建议,但似乎都导致了相同的分段错误。

它可以编译,但是当它试图覆盖第一个值时,它只会在第二次迭代时崩溃。

非常感谢任何帮助、建议或意见。如果我同时自己找到解决方案,我会在这里发布。

问候,反

PS:在 ubuntu 上使用 gcc 版本 4.8.2