Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在一个文件中解析多个XML对象_C#_Xml_Parsing - Fatal编程技术网

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

C# 在一个文件中解析多个XML对象,c#,xml,parsing,C#,Xml,Parsing,我有以下输入字符串,它来自一个10MB的文本文件。有时xml元素之间存在\n和其他值,有时不存在 string data=“\n1\n2\n\n3\n\n4” 现在,我希望通过element1和element2XML节点获得这个字符串 这种情况下的结果应该是 output[0] = "<element1 value=\"3\"><sub>1</sub></element1>"; output[1] = "<element1><su

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

string data=“\n1\n2\n\n3\n\n4”

现在,我希望通过
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>";
输出[0]=“1”;
输出[1]=“2”;
输出[2]=“3”;
输出[3]=“4”;
我试过了

string[] output= input.Split(new string[] { "<element1>", "<element2>" }, StringSplitOptions.None);
string[]output=input.Split(新字符串[]{”“,”“},StringSplitOptions.None);
但它抛出了OfMemory异常,并且在拆分时删除了删除程序

xmldocumentxml=newxmldocument();
LoadXml(“+data+”);
抛出异常


有没有一种简单的方法可以从我的文本文件中解析这些xml元素

从何处获得无效XML:与他交谈并要求提供有效的XML。其他一切都是黑客,迟早会被破解的

不推荐的黑客和不稳定版本:

“”+data+“”
提供以下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>

1.
2.
3.
4.
这是无效的,因为处理指令不在开头


删除处理指令,它应该可以工作。找到第一个
“?>”
并删除之前的所有内容对我来说相当安全。在实际XML中,您必须考虑多个处理指令,如“代码> <代码> >和<代码> <代码> .< /p> 您从哪里得到无效XML:与他交谈并要求提供有效的XML。其他一切都是黑客,迟早会被破解的

不推荐的黑客和不稳定版本:

“”+data+“”
提供以下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>

1.
2.
3.
4.
这是无效的,因为处理指令不在开头


删除处理指令,它应该可以工作。找到第一个
“?>”
并删除之前的所有内容对我来说相当安全。在实际XML中,您必须考虑多个处理指令,如“代码> <代码> > <代码> <代码> .< /p> ,您需要删除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());
    }
string data=“\n1\n2\n\n3\n\n4”;
//清除空白并解析出标题
data=data.Trim();
var pos=数据索引(“?>”)+2;
data=string.Concat(“,data.Substring(pos,data.Length-pos),”);
var xml=XDocument.Parse(数据);
//节点将具有所有元素1、2。。。等
var nodes=xml.subjects(),其中(d=>d.Name.LocalName.Contains(“元素”);
//如果需要加载到字符串列表。
var items=新列表();
foreach(节点中的var节点)
{
Add(node.ToString());
}

您需要删除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());
    }
string data=“\n1\n2\n\n3\n\n4”;
//清除空白并解析出标题
data=data.Trim();
var pos=数据索引(“?>”)+2;
data=string.Concat(“,data.Substring(pos,data.Length-pos),”);
var xml=XDocument.Parse(数据);
//节点将具有所有元素1、2。。。等
var nodes=xml.subjects(),其中(d=>d.Name.LocalName.Contains(“元素”);
//如果需要加载到字符串列表。
var items=新列表();
foreach(节点中的var节点)
{
Add(node.ToString());
}

无论从何处获得无效XML:与他交谈并要求提供有效的XML。其他所有内容都是黑客攻击,迟早都会被破解。每个XML本身都是有效的,但它们由元数据和LineBreaks分隔。请告诉您,当您尝试将其加载到XmlDocument中时引发了什么异常。@OguzOzgul System.XML.XmlException:意外的XML声明。XML声明必须是文档中的第一个节点,并且在itI之前不允许出现空白字符。我建议删除文档开头的\n并再次尝试XmlDocument方法。从何处获取无效XML:与他交谈并要求提供有效的XML。其他所有内容都是黑客攻击,迟早都会被破解。每个XML本身都是有效的,但它们由元数据和LineBreaks分隔。请告诉您,当您尝试将其加载到XmlDocument中时引发了什么异常。@OguzOzgul System.XML.XmlException:意外的XML声明。XML声明必须是文档中的第一个节点,并且在itI建议删除文档开头的\n并重试XmlDocument方法之前,不允许出现空白字符。。