2016-01-21 3 views
0

В настоящее время я работаю с .NET 3.5 для Windows CE. Реализация XmlReader является настраиваемой, принадлежащей производителю устройства. Имея это в виду, возможно, XmlReader просто отстой.XmlReader.Name, возвращающее пустую строку при последующих вызовах

У меня есть следующий код теста:

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

печать в моем сделай то время как петля дает мне выход я ожидаю:

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.

Я предполагаю, что я делаю какую-то глупую ошибку здесь, но я смотрел на это пару часов и не вижу ничего очевидного. Любые подсказки?

ответ

0

Еще 30 минут борьбы с этой штукой, и получается, что ReadSubtree() НЕ возвращает новый объект. Вызвав ToArray в IEnumerable, тест нечаянно читает в конце документа.

//XmlReader output = reader.ReadSubtree(); 
XmlReader output = new XmlReader(reader.ReadOuterXml()); 
Смежные вопросы