2015-01-21 42 views
1

我有大量的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

回答

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

0

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

也許你可以嘗試用sed

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

到位-i標誌編輯文件,所以一定要確保你有一個備份您在運行之前。

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