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

时间:2015-01-21 10:00:54

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

我是带有文本块的大量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函数没有采用三个参数。但是应该是cplusplus regex replace上的示例中的3个参数版本。

2 个答案:

答案 0 :(得分:1)

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

请注意,如果您在Visual Studio中进行调试,当您将鼠标悬停在编辑器中的变量上时,工具提示中会忽略换行符,这可能导致您认为他们不是保留。

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

如果你仍想沿着正则表达式路线走下去,你还需要知道要在搜索和替换字符串中转义的字符。

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

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

答案 1 :(得分:0)

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

也许你可以试试sed

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

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

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