如何使用 boost 属性树提取 xml 文件的 DOCTYPE 节点?

Posted

技术标签:

【中文标题】如何使用 boost 属性树提取 xml 文件的 DOCTYPE 节点?【英文标题】:How can I extract an xml file's DOCTYPE node using a boost property tree? 【发布时间】:2015-04-21 14:04:14 【问题描述】:

我找到了一些关于如何使用 boost 属性树来读取 xml 文件的绝妙示例。然而,对我来说真正令人头疼的是提取 DOCTYPE 值。给定一个带有以下行的 xml 文件:

<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">

如果我这样做:

// Create an empty property tree object
boost::property_tree::ptree pt;

// Load the XML file into the property tree.
boost::property_tree::read_xml(filenameIn, pt);

// and then immediately write it back out again...
boost::property_tree::write_xml(filenameOut, pt);

我希望 content(filenameOut) == content(filenameIn)。

但事实并非如此。具体来说,缺少 DOCTYPE 节点。因此如何提取 DOCTYPE 节点的值?

【问题讨论】:

【参考方案1】:

你不能。

PropertyTree 是一个库,用于将属性树序列化/反序列化为多种可能易于使用的格式。

PropertyTree 不是 XML 库。或 JSON 库。

What XML parser should I use in C++?(我推荐 PugiXML;这是我使用 PugiXML 添加处理指令的答案:Add XML headers using Boost's property trees)

关于添加处理指令:可以使用API​​中未记录的部分:

Add xml-stylesheet processing instructions to boost property_tree

【讨论】:

对,但是 boost 属性树确实有一个 xml_parser,它使用 rapidxml 作为其底层实现。据我所知,rapidxml 确实允许解析 doctype 节点。但是从挖掘 boost 代码来看,boost 似乎没有利用它。 Boost 确实利用了它。实现属性树。你期待什么? (如果您需要一个 XML 库,是什么阻止您使用 rapidxml?似乎是绕道而行,先将所有内容都放入 poperty 树中) 如果我正确理解了代码库(不太可能;-)),boost 属性树不支持 rapidxml 标志 'parse_doctype_node'。因此,当解析包含 doctype 节点的 xml 文件时,会简单地忽略 doctype 节点。 直接使用 rapidxml 似乎是一个明智的想法 :-)

以上是关于如何使用 boost 属性树提取 xml 文件的 DOCTYPE 节点?的主要内容,如果未能解决你的问题,请参考以下文章

使用 Boost 的属性树添加 XML 标头 [重复]

使用 boost 属性树解析 XML

Boost属性树xml解析No such node()

使用属性树在 boost 中解析 xml

使用 Boost 属性树解析 SVG (XML)

如何使用 boost::property_tree 重置 xml 元素的属性?