XML解析器,多个根

问题描述:

这是输入字符串的一部分,我无法修改它,它总会以这种方式来(通过共享内存),但是我可以在修改后将其放入字符串中:XML解析器,多个根

<sys><id>SCPUCLK</id><label>CPU Clock</label><value>2930</value></sys><sys><id>SCPUMUL</id><label>CPU Multiplier</label><value>11.0</value></sys><sys><id>SCPUFSB</id><label>CPU FSB</label><value>266</value></sys> 

我和两个阅读:

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

,但它们都具有运行时错误;输入有多个根(有多个根元素引用),我不想分割字符串。

他们的任何方式读取字符串取<value></value>之间的值没有吐字串到多个输入?

+2

但是,您只能在XML文档中拥有一个根目录,否则它将不会被称为文档的根目录。 –

这不是一个良好的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 
      } 
     } 
    } 
} 
+1

如果您不介意,我已经添加了一个示例来说明如何应用它。 –

+0

我根本不介意!谢谢!我终于有点工作了!现在它打印到CMD的XML格式为:http:// pastebin。com/z9DbSFUm(无法获得格式在评论中工作)现在我需要做的所有选择值节点和打印CMD或字符串等更接近我的目标谢谢! – Csharpz

XML元素必须有一个根元素,以及所需的任何子结构。 你的XML字符串看起来像:

<sys> 
    ... 
</sys> 
<sys> 
    ... 
</sys> 

有效的版本将是:

<someRootElement> 
    <sys> 
    ... 
    </sys> 
    <sys> 
    ... 
    </sys> 
</someElement> 

尝试:

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

它工作不正常,我得到无效字符“。”当它运行时。没有的字符串的全部长度是3388(打印到hdd上的TXT文件中找出来),所以我加了13并得到了3401(因为那是多长时间的根标签)整个代码:http:// pastebin。 com/9jvwP73e即时提到的是在代码中,所以你可能不会看到链接 – Csharpz

+0

XmlElement node = document.SelectSingleNode(“/ Input/txt1”)as XmlElement;对我更好,但感谢所有帮助 – Csharpz

将该溶液成功地解析所有节点类型,包括文本节点:

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声明,因为它不是一个节点。