如何用XmlReader的ReadToFollowing读取XML中Teacher与Student元素
同时读取XML中的Teacher和Student元素
你当前的代码只盯着查找Teacher元素,完全没处理Student,而且ReadToFollowing会直接跳转到指定名称的元素,跳过中间其他节点,自然没法同时捕获两种元素。
要在单次XmlReader实例中同时读取这两类元素,你可以通过遍历所有节点,判断元素名称来分别处理,具体代码如下:
using (XmlReader xmlReader = XmlReader.Create("school.xml")) { while (xmlReader.Read()) { // 只处理元素的开始节点 if (xmlReader.NodeType == XmlNodeType.Element) { switch (xmlReader.Name) { case "Teacher": Console.WriteLine("=== 教师信息 ==="); // 读取姓名 xmlReader.ReadToDescendant("Name"); Console.WriteLine($"姓名:{xmlReader.ReadElementContentAsString()}"); // 读取科目 xmlReader.ReadToFollowing("Subject"); Console.WriteLine($"科目:{xmlReader.ReadElementContentAsString()}"); break; case "Student": Console.WriteLine("=== 学生信息 ==="); // 读取姓名 xmlReader.ReadToDescendant("Name"); Console.WriteLine($"姓名:{xmlReader.ReadElementContentAsString()}"); // 读取地址 xmlReader.ReadToFollowing("Address"); Console.WriteLine($"地址:{xmlReader.ReadElementContentAsString()}"); break; } } } }
注意事项
- 你提供的XML原结构中,Teacher节点下的
<Name>和<Subject>标签没有正确闭合(缺少</),实际运行时需要修正为合法的XML格式,否则XmlReader会抛出解析错误。 Read()方法会逐个遍历XML中的所有节点(包括元素、文本、注释等),通过判断NodeType == XmlNodeType.Element可以过滤出元素的开始标签,避免处理无关节点。- 针对不同元素的子节点,用
ReadToDescendant或ReadToFollowing定位后,通过ReadElementContentAsString()直接读取元素内容,同时会自动跳过元素的结束标签,简化后续读取逻辑。
内容的提问来源于stack exchange,提问作者Gladstone Jaffrey
相关产品推荐
相关产品推荐

