这是输入字符串的一部分,我无法修改它,它总会以这种方式(通过共享内存),但我可以修改后,我把它放入一个字符串当然:
<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>
之间的值,而不会将字符串调整为多个输入吗?
答案 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声明,因为它不是节点。