【问题标题】:Read each node in IEnumerable<XElement> using XMlReader使用 XMlReader 读取 IEnumerable<XElement> 中的每个节点
【发布时间】:2017-07-25 12:20:45
【问题描述】:

我有 IEnumerable&lt;XElement&gt; theTestCaseNodes,它有以下类型的 XElements

<testcase>
    <Main>  
       <test_step type ="action">
           <Name>Goto</Name>
           <description>xxxxxxxxx</description>    
       </test_step>  
       <test_step type ="check">
           <Name>Click</Name>
           <description>xxxxxxxxx</description>
       </test_step>  
    </Main>  
</testcase>
<testcase>
    <Main>  
       <test_step type ="action">
           <Name>Goto</Name>
           <description>xxxxxxxxx</description>    
       </test_step>  
       <test_step type ="check">
           <Name>Type</Name>
           <description>xxxxxxxxx</description>
       </test_step>  
    </Main>  
</testcase>

基本上这是我的测试用例,我想按顺序执行它们。 所以,现在我想使用 XMLReader 读取 IEnumerable 中的每个节点。

请帮助如何进行!

我知道我需要使用“使用”,但不知道如何进行。

public void ExecuteTestcase(IEnumerable<XElement> theTestCaseNodes)
{
    using (XmlReader aNodeReader = XmlReader.ReadSubtree()) {

    }
}

【问题讨论】:

  • 您可以将您的 xml 写入一个字符串,在其上创建一个 StringReader 并将其传递给 XmlReader。请注意,您必须在usingCreate 阅读器,然后您可以调用实例方法,例如ReadSubtree
  • 为什么你想使用 XmlReader?用于将文本转换为 DOM,但您已经拥有 DOM 级别的元素。
  • @HenkHolterman,请让我了解更多。我是 XML 新手。我想在这里使用 XMLReader,因为我想按顺序进行。步骤有两种类型,“type=Action”和“type=check”,我想按顺序阅读。
  • 整个顺序的概念在 XML 中有点棘手,但 xElement.Elements("test_step") 应该可以满足您的需求。

标签: c# linq-to-xml xmlreader xelement system.xml


【解决方案1】:

使用XElement.CreateReader 为元素实例化XmlReader

public void ExecuteTestcase(IEnumerable<XElement> theTestCaseNodes)
{
    foreach(var node in theTestCaseNodes)
    {
        using (var reader = node.CreateReader())
        {
            // use XmlReader for testing
        }
    }
}

XNode.CreateReader Method ()

如果XmlReader 的主要目的是以正确的顺序读取元素,则循环遍历元素将按照它们在 xml 中出现的顺序执行它们

foreach(var testStep in theTestCaseNodes.Elements("test_step"))
{
    // execute step
}

如果您不想依赖 xml 的顺序,那么您可以通过 type 属性访问正确的步骤

foreach(var testStep in theTestCaseNodes.Elements("Main"))
{
    var action = testStep.Elements("test_step")
                         .First(step => step.Attribute("type") == "action");
    var check = testStep.Elements("test_step")
                        .First(step => step.Attribute("type") == "action");

    // execute action
    // execute check
}

【讨论】:

    猜你喜欢
    • 2011-05-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-29
    • 1970-01-01
    相关资源
    最近更新 更多