首页 文章

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

提问于
浏览
1

我有大量带有文本块的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 param版本,如cplusplus regex replace中的示例 .

2 回答

  • 0

    使用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

    是否有使用c的原因?

    也许你可以试试sed

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

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

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

相关问题