XML解析器,多个根

时间:2011-08-26 01:11:41

标签: c# xml split

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

<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>之间的值,而不会将字符串调整为多个输入吗?

3 个答案:

答案 0 :(得分:5)

这不是格式良好的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 :(得分:2)

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

答案 2 :(得分:0)

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

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