2015-11-12 3 views
0

У меня есть следующая строка ввода, которая из текстового файла 10 МБ. Иногда иногда есть \ n и другие значения между элементами xml.Анализ нескольких объектов XML в одном файле

string data = "\n<?xml version=\"1.0\" encoding=\"UTF-8\"?><element1 value=\"3\"><sub>1</sub></element1>\n<element1><sub><element>2</element></sub></element1>\n \n<element2><sub>3</sub></element2>\n \n<element2><sub>4</sub></element2>";

теперь я хочу эту строку на element1 и element2 XML узлов

результат в этом случае должно быть

output[0] = "<element1 value=\"3\"><sub>1</sub></element1>"; 
output[1] = "<element1><sub><element>2</element></sub></element1>"; 
output[2] = "<element2><sub>3</sub></element2>"; 
output[3] = "<element2><sub>4</sub></element2>"; 

Я попытался

string[] output= input.Split(new string[] { "<element1>", "<element2>" }, StringSplitOptions.None); 

но он бросает из памяти, кроме ионов, а делетитор удаляется при расщеплении.

и

XmlDocument xml = new XmlDocument(); 
xml.LoadXml("<root>"+data +"</root>"); 

бросает исключение

есть простой способ разбора этих XML-элементы из моего текстового файла?

+2

У вас есть недопустимый XML из: поговорите с ним и попросите предоставить действительный XML. Все остальное - взломать и рано сломается. –

+0

каждый XML для своего двенадцати действителен, но они разделены метаданными и разрывами строк. – Byyo

+0

Можете ли вы рассказать, какое исключение вызывается при попытке загрузить его в XmlDocument. –

ответ

3

Вам нужно будет удалить заголовок xml, а затем поместить корневой узел. После этого вы можете использовать XDocument для разбора и выбора необходимых элементов.

string data = "\n<?xml version=\"1.0\" encoding=\"UTF-8\"?><element1 value=\"3\"><sub>1</sub></element1>\n<element1><sub><element>2</element></sub></element1>\n \n<element2><sub>3</sub></element2>\n \n<element2><sub>4</sub></element2>"; 

    //Clear whitespace and parse out the header 
    data = data.Trim(); 
    var pos = data.IndexOf("?>") + 2; 
    data = string.Concat("<root>",data.Substring(pos, data.Length - pos), "</root>"); 

    var xml = XDocument.Parse(data); 

    //Nodes will have all the elements1, 2... etc. 
    var nodes = xml.Descendants().Where(d => d.Name.LocalName.Contains("element")); 

    //if you need to load to string list. 
    var items = new List<string>(); 
    foreach(var node in nodes) 
    { 
     items.Add(node.ToString()); 
    } 
2

У вас есть недопустимый XML: поговорите с ним и попросите предоставить действительный XML. Все остальное - взломать и рано сломается.

не рекомендуется Hacky и нестабильная версия:

"<root>"+data +"</root>" дает следующий XML

<root> 
<?xml version="1.0" encoding="UTF-8"?> 
    <element1 value="3"><sub>1</sub></element1> 
    <element1><sub><element>2</element></sub></element1> 
    <element2><sub>3</sub></element2> 
    <element2><sub>4</sub></element2> 
</root> 

который является недействительным, так как инструкция обработки не в начале.

Удалите инструкцию по обработке, и она должна работать. Обнаружение первого "?>" и удаление всего, прежде чем звучит совершенно безопасно для меня. В реальном XML вам придется рассмотреть несколько инструкций обработки, таких как <?xml ...?> и <?xml-stylesheet ... ?>.