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

问题描述:

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

到目前为止我的代码:

#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;"); 

...然后我想将字符串传递到快速的XML解析器。未编码的换行符被这个(以及其他许多)解析器忽略,我试图用&#10;手动替换它。它完美的工作,但文件是31K线,这将需要永远。

我甚至不知道这正则表达式是正确的,但我的VS编译器抱怨的search_replace功能不服用三PARAMS。但是应该是一个3参数版本,如cplusplus regex replace上的示例。

+0

你提到'标签内,但你的正则表达式意味着标签(内容)之间。也是正则表达式在VS2010中可用?我使用该编译器,我必须使用Boost,因为它不是C++ 11。另外,如果不是Dot-all模式,如果在同一行上有'。*'的话,它们会向右移动并进入标签的中间位置。 – sln 2015-01-26 17:58:33

+0

是,可用https://msdn.microsoft.com/de-AT/library/bb982382.aspx,我得到的,因为转义序列的一些警告,但它们可以被禁用。 – masche 2015-01-27 07:13:38

+0

链接你引用的是VS2013,而不是你在问题中标记的VS2010。我认为VS2010其实并没有C++ 11。 – sln 2015-01-27 18:40:23

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

我在后面的演示文稿中需要实际的换行符。 xml文件的创建者只是简单地序列化复古数据库中的数据,并忘记了它包含的预格式化文本。 为了呈现这个文本,我需要保留换行符,并在解析之前替换文本对我来说似乎是最好的想法。 我使用rapidxml 1.13,如果我像上面的示例代码一样使用它(忽略正则表达式的东西),它在我通过DOM访问文本时删除了所有未编码的换行符。 – masche 2015-01-27 09:42:53

+1

我现在明白你的问题了,并用解决方案更新了我的答案。 – softwariness 2015-01-27 09:52:00

+0

谢谢,这工作得很好! 我不认为这会很容易,但另一方面,我从来没有看过rapidxml_utils.hpp。 也许编辑你的解决方案,你将不得不包含rapidxml_utils.hpp。 – masche 2015-01-27 10:18:55

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

也许你可以尝试用sed

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

到位-i标志编辑文件,所以一定要确保你有一个备份您在运行之前。

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