XmlReader.Name 在后续调用中返回空字符串

XmlReader.Name returning empty string on subsequent calls

我目前正在为 Windows CE 使用 .NET 3.5。 XmlReader 实现是自定义的,属于设备制造商。考虑到这一点,XmlReader 可能很糟糕。

我有以下测试代码:

[TestFixture]
public class XmlUtilsTest
{
    private const string EXAMPLE_XML =
    "<Level1>"
        + "<Level2>"
        + "</Level2>"
        + "<Level2>"
            + "<Level3>Some text</Level3>"
        + "</Level2>"
    + "</Level1>"; 

    [Test]
    public void GetElementsAtPathTest()
    {
        IEnumerable<XmlReader> results = XmlUtils.GetElementsAtPath(EXAMPLE_XML, "Level1", "Level2");
        XmlReader[] readers = results.ToArray();

        Assert.AreEqual(2, readers.Length);
        Assert.AreEqual("Level2", readers[0].Name);
        Assert.AreEqual("Level2", readers[1].Name);
    }
}

对于以下方法:

public static IEnumerable<XmlReader> GetElementsAtPath(string xml, params string[] path)
{
    using (XmlReader reader = new XmlReader(xml))
    {
        if (!MoveToElementAtPath(reader, path))
            yield break;

        string siblingName = path[path.Length - 1];

        do
        {
            XmlReader output = reader.ReadSubtree();
            output.Read();

            PrintLine(output.Name + " " + output.NodeType);

            yield return output;
        }
        while (reader.ReadToNextSibling(siblingName));
    }
}

在我的 do-while 循环中打印给出了我期望的输出:

Level2 Element
Level2 Element

但是测试失败:

Failed : GetElementsAtPathTest
  Expected string length 6 but was 0. Strings differ at index 0.
  Expected: "Level2"
  But was:  <string.Empty>

不知何故,在 运行 方法和断言结果之间,XmlReader.Name 的状态发生了变化。

我想我在这里犯了一些愚蠢的错误,但我已经盯着它看了几个小时,但看不到任何明显的东西。有什么线索吗?

又花了 30 分钟来解决这个问题,结果 ReadSubtree() 没有返回新对象。通过在 IEnumerable 上调用 ToArray,测试无意中读到了文档的末尾。

//XmlReader output = reader.ReadSubtree();
XmlReader output = new XmlReader(reader.ReadOuterXml());