c# - 使用 LINQ 或 XPATH 将 xml 节点的后代作为 List<string> 返回

标签 c# xml linq xpath

我有一个这样的xml文件

<Document>
   <Tests>
       <Test>
          <Name>A</Name>
          <Type>Like A</Type>
          <Members>
               <Member>1</Member>
               <Member>2</Member>
               <Member>3</Member>
          </Members>
       </Test>
       <Test>
          <Name>B</Name>
          <Type>Like B</Type>
          <Members>
               <Member>4</Member>
               <Member>5</Member>
               <Member>6</Member>
          </Members>
       </Test>
    </Tests>
</Document>

现在我创建了一个类来保存每个测试节点的数据:

public class TestData
{
public string Name {get;set;}
public string Type {get;set;}

public List<string> Members = new List<string>();

public AddMembers(List<string> members)
{
Members.AddRange(members);
}
}

现在我正在尝试使用 xpath 来填充我的 TestData 类,但是我在将成员添加到我的列表时遇到了问题。我正在尝试使用 LINQ,但我还做不到 :(

   public List<TestClass> GetTests()
    {
        List<TestClass> tests = new List<TestClass>();
        TestClass test;

        XPathNodeIterator it = nav.Select("/Document/Tests/Test");

        foreach (XPathNavigator val in it)
        {
            test= new TestClass();
            test.Name = val.SelectSingleNode(nav.Compile("Name")).Value;
            test.Type = val.SelectSingleNode(nav.Compile("Type")).Value;
            test.AddMembers(); //How can I return all the member nodes in a list?

            tests.Add(test);
        }


        return tests ;
    }

最佳答案

老实说,您一开始并不清楚为什么要使用 XPathNodeIterator。如果您可以为此使用 LINQ to XML,那真的很简单:

var list =  doc.Descendants("Test")
               .Select(x => TestClass.FromXElement(x))
               .ToList();

TestClass.FromXElement 是这样的:

public static TestClass FromXElement(XElement element)
{
    string name = (string) element.Element("Name");
    string type  = (string) element.Element("Type");
    List<string> members = element.Descendants("Member")
                                  .Select(x => x.Value)
                                  .ToList();
    return new TestClass(name, type, members);
}

(如果您想更严格地控​​制层次结构,则不必使用 Descendants。例如,在 TestClass.FromXElement 中,您可以使用 element.Element("成员").Elements("成员")

关于c# - 使用 LINQ 或 XPATH 将 xml 节点的后代作为 List<string> 返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8383062/

相关文章:

c# - 使用 LinQ 从列表返回另一个列表中不存在的值

c# - 在声明时初始化 tabpage 数组

c# - 将对象类型作为参数传递

c# - EfCore 与 DDD 中的多对多关系

sql-server - 在 Linq 中查询速度慢,在 LinqPad、SQL Management Studio 和 SQL Profiler 中查询速度快

c# - 排序列表并在排序后将特定元素保留在列表末尾

c# MySqlCommand 似乎没有解析参数

xml - 将具有相同属性名称的多个元素转换为一个新元素,并将这些属性值作为子元素

xml - 将 HL7 段转换为 XML

java - Android - 在视频上创建圆形蒙版