C++ 如何在XML文本(标记)中搜索换行符?

C++ 如何在XML文本(标记)中搜索换行符?,c++,regex,xml,visual-studio-2010,visual-c++,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

我有一个包含文本块的大量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;");
#包括
...
std::string sInput_xml;
std::ifstream-in(sfilepathxmlfile);
//将文件读入输入xml
while(getline(in,sLine))
sInput_xml+=sLine;

STD::ReXEX RXSARK(“\>*(\n)+**< P>)有使用C++ +?/P>的理由吗? 也许你可以试试塞德

sed -i ':a;N;$!ba;s/\n/&#10;/g' input.xml
-i标志“编辑文件”已就位,因此请确保在运行该文件之前有备份

参考文献

使用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());
#包括“rapidxml_utils.hpp”
// ...
rapidxml::文件xmlFile(“test.xml”);
rapidxml::xml_文档文档;
parse(xmlFile.data());

您在标签中提到了
,但您的正则表达式暗示了标签之间(内容)。另外,在VS2010中是否也可以使用正则表达式?我使用该编译器,并且我必须使用Boost,因为它不是c++11。此外,如果不是点所有模式,
*
将直接通过标记并进入标记中间(如果在同一行上)。是的,是可用的,由于转义序列,我会收到一些警告,但它们可以被禁用。您引用的链接说的是VS2013,不是你在问题中标记的VS2010。我认为VS2010实际上没有c++11。你是对的,我很高兴软性为我指出了一个不使用任何正则表达式的解决方案。@sln正则表达式库在VS 2010中,但它有点不稳定。2010年有很多c++11功能(尽管今年有)因为人们已经期待着新的C++标准的长期使用。我需要在本文的演示文稿后面的实际断线。XML文件的创建者只是从一个老式数据库中序列化数据,并且忘记了它包含的预格式化文本。为了呈现这篇文章,我需要保留Br行。对我来说,在解析之前说出并替换文本似乎是最好的主意。我使用rapidxml 1.13,如果我像上面的示例代码那样使用它(忽略正则表达式),当我通过DOM访问文本时,它已删除了所有未编码的换行符。我现在理解了您的问题,并用解决方案更新了我的答案。谢谢,这很好!我认为这不会那么容易,但另一方面,我从未看过rapidxml_utils.hpp。也许编辑您的解决方案时,您必须包含rapidxml_util很好的一点,现在添加了-经过反思,我认为您关于头文件命名的观点有点违反直觉。