在一个文件中解析多个XML对象

时间:2015-11-12 14:08:34

标签: c# xml parsing

我有以下输入字符串,它来自10MB的文本文件。有时在xml元素之间有\ n和其他值有时不会。

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

现在我想通过element1element2 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 个答案:

答案 0 :(得分: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());
    }

答案 1 :(得分:2)

无论您从哪里获得无效的XML:与他交谈并要求提供有效的XML。其他一切都是黑客攻击,迟早会破裂。

不推荐hacky和unstable版本:

"<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 ... ?>