如何使用BoostptreeC++解析值中包含HTML标记的XML

How to parse an XML that has HTML tags in its value using Boost ptree C++

本文关键字:HTML XML 包含 BoostptreeC++ 何使用      更新时间:2023-10-16

我想使用Boost Ptree 解析以下XML

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

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

我如何解析HTML标签,如,并通过boost ptree

作为我的价值的一部分

从XML解析器的角度来看,<文本>和<b> 。<b> 部分因此成为属性树中的另一个属性。如果布局得当,它看起来是这样的:

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

根据你的问题,你真的想要<b> 是内容,而不是XML标记。如果是这样,您应该将其编码为内容,而不是标记。这很简单:

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

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

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

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

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

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

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

有趣的是,相同的标记规则在stackoverflow编辑器中也适用,我不得不返回并替换我的<通过&lt;使其正确显示;-)