是否有可能仅使用c# XmlReader构建dom树?

本文关键字:构建 dom XmlReader 有可能 是否 | 更新日期: 2023-09-27 18:03:26

我想用XmlReader在任何有效的xml字符串上构建一个dom树,而不使用XmlDocument或类XDocument。在确定元素<tank>是否是元素<plane>的子节点时遇到了困难。因为元素<plane>没有结束标签。如果这个困难解决了,那么我就可以生成Dom树了。有人知道如何解决这个问题吗?或者有人知道如何用XmlReader动态地构建DOM树吗?

Xml内容:

<?xml version="1.0" encoding="utf-8" ?>
<root>
    <plane visible="false" />
    <tank>
        <weapon name="cannon">equipped</weapon>
    </tank>
    <ship>
        <weapon name="cannon">equipped</weapon>
    </ship>
</root>

显示细节的脚本

XmlReader xr = XmlReader.Create(xmlContent);
while (xr.Read())
{
    Logger.Log(string.Concat("[", xr.NodeType, "][", xr.ValueType, "]", xr.Name, ",(",xr.HasValue,")" + xr.Value));
}

[XmlDeclaration]    [System.String] xml,(True)version="1.0" encoding="utf-8"
[Element]           [System.String] root,(False)
[Element]           [System.String] plane,(False)
[Element]           [System.String] tank,(False)
[Element]           [System.String] weapon,(False)
[Text]              [System.String] ,(True)equipped
[EndElement]        [System.String] weapon,(False)
[EndElement]        [System.String] tank,(False)
[Element]           [System.String] ship,(False)
[Element]           [System.String] weapon,(False)
[Text]              [System.String] ,(True)equipped
[EndElement]        [System.String] weapon,(False)
[EndElement]        [System.String] ship,(False)
[EndElement]        [System.String] root,(False)

是否有可能仅使用c# XmlReader构建dom树?

这里的问题是<plane>标签不是 <tank>标签的父级-它是它的兄弟姐妹。如果<plane>标签需要成为<tank>标签的父元素,则需要将其包装在xml中。

如果不可能更改xml,则可以使用xr.IsEmptyElement来确定标记是否自闭,并具有相应的自定义逻辑。