XML解析器,多个根

这是输入字符串的一部分,我不能修改它,它总是以这种方式(通过共享内存),但我可以修改后,我把它放入一个字符串当然:

SCPUCLK2930SCPUMUL11.0SCPUFSB266 

我用两个都读过它:

  String.Concat( XElement.Parse(encoding.GetString(bytes)) .Descendants("value") .Select(v => v.Value)); 

和:

  XmlDocument document = new XmlDocument(); document.LoadXml(encoding.GetString(bytes)); XmlNode node = document.DocumentElement.SelectSingleNode("//value"); Console.WriteLine("node = " + node); 

但是他们跑步时都有错误; 输入有多个根(有多个根元素引用),我不想分割字符串。

他们以任何方式读取字符串都取之间的而不将字符串拼接成多个输入?

这不是一个格式良好的XML文档,因此大多数XML工具都无法处理它。

XmlReader是一个例外。 在MSDN中查找XmlReaderSettings.ConformanceLevel 。 如果将其设置为ConformanceLevel.Fragment ,则可以使用这些设置创建XmlReader ,并使用它从没有顶级元素的流中读取元素。

您必须编写使用XmlReader.Read()执行此操作的代码 – 您不能只将它提供给XmlDocument (它确实需要有一个顶级元素)。

例如,

 var readerSettings = new XmlReaderSettings { ConformanceLevel = ConformanceLevel.Fragment }; using (var reader = XmlReader.Create(stream, readerSettings)) { while (reader.Read()) { using (var fragmentReader = reader.ReadSubtree()) { if (fragmentReader.Read()) { var fragment = XNode.ReadFrom(fragmentReader) as XElement; // do something with fragment } } } } 

XML元素必须具有一个根元素,具有您想要的任何子结构。 您的xml字符串如下所示:

  ...   ...  

有效版本为:

   ...   ...   

尝试:

 XmlDocument document = new XmlDocument(); document.LoadXml(""+encoding.GetString(bytes)+""); XmlNode node = document.DocumentElement.SelectSingleNode("//value"); Console.WriteLine("node = " + node); 

此解决方案成功解析所有节点类型,包括文本节点:

 var settings = new XmlReaderSettings{ConformanceLevel = ConformanceLevel.Fragment}; var reader = XmlReader.Create(stream, settings); while(reader.Read()) { while(reader.NodeType != XmlNodeType.None) { if(reader.NodeType == XmlNodeType.XmlDeclaration) { reader.Skip(); continue; } XNode node = XNode.ReadFrom(reader); } } 

跳过XML声明,因为它不是节点。