【问题标题】:XML parser, multiple rootsXML 解析器,多个根
【发布时间】:2011-08-26 01:11:40
【问题描述】:

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

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

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

他们是否有任何读取字符串的方法可以获取&lt;value&gt;&lt;/value&gt; 之间的值,而不会将字符串吐入多个输入?

【问题讨论】:

  • 但是你在一个 XML 文档中只能有一个根...否则它不会被称为文档的根。

标签: c# xml split


【解决方案1】:

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

【讨论】:

  • 如果您不介意,我添加了一个示例来说明如何应用它。
  • 我一点也不介意!谢谢你!我终于让它有点工作了!现在它打印到 CMD 的 xml 格式为:pastebin.com/z9DbSFUm(无法在评论中使用格式)现在我需要做的就是选择值节点并打印到 CMD 或字符串等,更接近我的目标谢谢!
【解决方案2】:

XML 元素必须有 ONE 根元素,以及您想要的任何子结构。 您的 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);

【讨论】:

  • 它工作不正常,我得到无效字符“。”当它运行时。没有 的字符串的整个长度是 3388(打印到 HDD 上的 TXT 文件以找出答案)所以我添加了 13 并得到了 3401(因为这就是根标签的长度)整个代码:@ 987654321@我指的是代码中的,所以你可能看不到链接
  • XmlElement node = document.SelectSingleNode("/Input/txt1") as XmlElement;对我来说效果更好,但感谢所有帮助
【解决方案3】:

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

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

【讨论】:

    猜你喜欢
    • 2016-11-12
    • 2015-01-19
    • 1970-01-01
    • 2018-10-25
    • 1970-01-01
    • 1970-01-01
    • 2020-03-15
    • 1970-01-01
    • 2017-05-06
    相关资源
    最近更新 更多