如何使用 Boost ptree C++ 解析其值中包含 HTML 标记的 XML

Posted

技术标签:

【中文标题】如何使用 Boost ptree C++ 解析其值中包含 HTML 标记的 XML【英文标题】:How to parse an XML that has HTML tags in its value using Boost ptree C++ 【发布时间】:2016-07-30 06:33:50 【问题描述】:

我想使用 Boost Ptree 解析以下 XML

<MsgTxt>
<Abc>123</Abc>
<Text>This is my <b>Text</b></Text>
</MsgTxt>

但是,当我遍历 XML 并使用 Message = v.second.get_value &lt;std::string&gt;("Text"); 时,html 标记及其内容会被截断。我得到的价值是“这是我的”。

我如何解析像 这样的 HTML 标签,并通过 boost ptree 作为我价值的一部分

【问题讨论】:

【参考方案1】:

从 XML 解析器的角度来看, 之间确实没有区别。 部分因此成为属性树中的另一个属性。布局得当,它看起来像这样:

<MsgTxt>
    <Abc>123</Abc>
    <Text>This is my 
        <b>Text</b>
    </Text>
</MsgTxt>

根据您的问题,您确实希望 是内容,而不是 XML 标记。如果是这样,您应该将其编码为内容 - 而不是标记。这很简单:

<MsgTxt>
<Abc>123</Abc>
<Text>This is my &lt;b&gt;Text&lt;/b&gt;</Text>
</MsgTxt>

XML 解析器会将这些&amp;lt;&amp;gt; 转换回为您正确的文本。

如果编码不正确,如果标签不平衡,也会遇到问题,例如

<MsgTxt>
<Abc>123</Abc>
<Text>This is my <b>Text</b><br></Text>
</MsgTxt>

这是不正确的 XML,XML 解析器将拒绝解析它。同样,这可以通过使用适当的内容编码来避免。

为了正确编码,请确保对以下字符进行编码:

< &lt;
> &gt;
& &amp;
" &quot;
' &apos;

有趣的是,同样的标记规则也适用于 *** 编辑器,我不得不返回并将我的 &lt; 以使其正确显示;-)

【讨论】:

以上是关于如何使用 Boost ptree C++ 解析其值中包含 HTML 标记的 XML的主要内容,如果未能解决你的问题,请参考以下文章

我们如何在另一个 boost ptree 中插入一个 boost ptree 作为节点?

如何手动创建具有 XML 属性的 boost ptree?

如何使 boost ptree 以相同的方式解析 xml 和 json?

使用 Boost ptree 解析 std::string

boost ptree 即时修改一组值

如何使用 boost ptree 删除 xml 属性?