我有以下输入字符串,它来自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>";
现在我想通过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元素吗?
答案 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 ... ?>
。