如何在pugixml中获取节点的内部XML
How to get inner XML of a node in pugixml?
我解析一个文档,并希望以字符串的形式检索XML树的一部分。文件(示例(:
<?xml version="1.0"?>
<MyConfig>
<MyData>
<Foo bar="baz>42</Foo>
</MyData>
<OtherData>Something</OtherData>
</MyConfig>
代码:
pugi::xml_document doc;
doc.load_file(documentFileName);
pugi::xml_node root = doc.child("MyConfig");
// parse custom data
_customData = root.child("MyData"). <-- HOW TO GET INNER XML?
自定义数据的预期内容(如果格式丢失,我不介意(:
"<Foo bar="baz>42</Foo>"
如何做到这一点?
我直接在文档中找到了一个解决方案,只是谷歌没有很好地索引它们,所以我不得不手动查找。我的解决方案是使用pugi::xml_writer
和node.print
。在文档中,他们甚至已经展示了std::string
:的实现
struct xml_string_writer: pugi::xml_writer
{
std::string result;
virtual void write(const void* data, size_t size)
{
result.append(static_cast<const char*>(data), size);
}
};
有了它,我只做了一个方便的函数来合并所有子节点的XML:
std::string InnerXML(pugi::xml_node target)
{
xml_string_writer writer;
for (pugi::xml_node child = target.first_child(); child; child = child.next_sibling())
child.print(writer, "");
return writer.result;
}
我认为pugi::xml_node::print()
是一种方式。
pugi::xml_node node = root.child("MyData");
pugi::xml_node child = node.first_child();
std::stringstream ss;
child.print(ss);
std::string s = ss.str();
问题是s
现在将具有值
<Foo bar="baz>42</Foo> </MyData> <OtherData>Something</OtherData> > </MyConfig>" />
- 这是从节点开始的文本树,并且
- html转义序列而不是
<
和>
会很混乱
并不理想,但这些问题显然可以通过一些字符串操作来解决。
// replace < with <
size_t off = 0;
while ((off = s.find("<", off)) != s.npos)
s.replace(off, 4, "<");
// replace > with >
off = 0;
while ((off = s.find(">", off)) != s.npos)
s.replace(off, 4, ">");
// truncate at the closing tag
size_t end_open = s.find(">", 0);
size_t end_close = s.find(">", end_open + 1);
s = s.substr(0, end_close + 1);
这将导致s
具有值
<Foo bar="baz>42</Foo>
相关文章:
- 反向给定链表中的K节点
- 如果我只是不访问queue_front节点的子节点,而是将它们推到队列中呢?还是BFS吗
- 将函数类成员映射到类本身内部
- Boost Graph Library,修复节点大小
- C++A*算法并不总是在路径中具有目标节点
- 如何找到2个单链表的公共节点
- Boost Spirit,获取迭代器内部语义动作
- 我不明白为什么我声明一个空的内部结构并将其传递给构造函数
- 内联函数中具有内部链接的全局变量
- 在函数内部的声明中初始化数组,并在外部使用它
- 如何在pugixml中获取节点的内部XML
- 如何在 C++11 的内存池中分配 std::map 的内部RB_tree节点?
- 嵌套的C 常数数据结构,没有初始化列表或明确命名所有节点-VC 2012过早破坏了内部元素
- 在C STL :: MAP内部节点中存储的内容
- C++ 链表:"->"运算符无法更改节点对象的内部值
- 为什么链表使用指针而不是将节点存储在节点内部
- C++链表:位于另一个节点内部的节点
- 为链表中的节点分配内存,但出乎意料的是,它内部的下一个节点也被分配了
- 一种寻找图中无边指向外的内部连通节点簇的算法
- 如何从双链表中获取节点内部的有效负载