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

标签 c++ regex xml visual-studio-2010 visual-c++

我有大量带有文本 block 的 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 解析器。这个(和许多其他)解析器忽略未编码的换行符,我尝试用 手动替换它。它工作得很好,但文件有 31k 行,这将需要很长时间。

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

最佳答案

使用 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());

关于c++ - 如何在 XML 文本(标签内)中搜索换行符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28064290/

相关文章:

c++ - 异常安全 : Strong Guarantee vs Basic Guarantee

c++ - 搞乱 initializer_list

Python 正则表达式搜索总是错误的?

java - 如何在字符串中使用模式replaceAll

Java 正则表达式 a-z、A-Z、0-9 和 (.)(_)(-)

php - 使用 PHP asXML 和 SimpleXMLElement 获取编码 ="UTF-8"独立 ="yes"

c++ - 如何以正确的方式将结构数组参数传递给函数?

java - 从 xml 响应中获取对象

java - Android:以编程方式使背景波纹化

python - Pytorch C++ (Libtroch),使用操作间并行性