如何在 XML 文本(标签内)中搜索换行符?

How to search for line breaks within XML text (within tags)?

我有大量包含文本块的 XML 文件,其中许多包含未编码的换行符。 如何在 XML 文本(标签内)中搜索换行符 (/n) 并将其替换为 HTML 编码的换行符,例如 
 ?

到目前为止我的代码:

#include <regex>
...
std::string sInput_xml;
std::ifstream in(sFilePath_XMLFile);

// read file into input_xml
while(getline(in, sLine))
    sInput_xml += sLine;

std::regex rxSearch("\>.*(\n)+.*\</");
std::regex_replace (sInput_xml, rxSearch,"&#10;");

... 然后我想将字符串传递给 rapid-xml 解析器。这个(和许多其他)解析器忽略未编码的换行符,我试图用 &#10; 手动替换它。它工作得很好,但文件是 31k 行,它会花很长时间。

我什至不确定这个正则表达式是否正确,但我的 VS 编译器抱怨 search_replace 函数没有采用三个参数。但是应该是一个 3 参数版本,就像 cplusplus regex replace.

上的例子一样

是否有使用 c++ 的原因?

也许你可以试试 sed

sed -i ':a;N;$!ba;s/\n/&#10;/g' input.xml

-i 标志编辑文件就位,因此请确保在 运行 之前有一个备份。

参考 How can I replace a newline (\n) using sed?

使用 RapidXML 1.13,在元素和属性中包含未转义换行符的 XML 文件被成功解析,并且属性和元素值为我保留了空格,所以我认为搜索和替换是不必要的。

请注意,如果您在 Visual studio 中进行调试,当您将鼠标悬停在编辑器中的某个变量上时,工具提示中会省略换行符,也许这就是让您相信它们未被保留的原因。

关于 regex_replace 函数的问题,如果您使用 std::string 作为第三个参数,它将编译。这似乎是 Visual Studio 2010 年的一个问题,因为 const char* 在 Visual Studio 2013 年被接受。

如果您仍想使用正则表达式,则还需要注意要在搜索和替换字符串中转义的字符。

更新:现在我意识到这是您在引入正则表达式之前如何加载文件的代表性代码,您应该知道 getline() 不包括换行符,所以这是您的加载代码从文件中删除换行符。最简单的事情就是使用 RapidXML 直接加载文件:

#include "rapidxml_utils.hpp"
// ...
rapidxml::file<> xmlFile("test.xml");
rapidxml::xml_document<> doc;
doc.parse<0>(xmlFile.data());