如何在C#中遍历XML子节点,不使用序列化类处理指定XML字符串?
在C#中遍历XML并按要求打印内容
没问题,我来给你一步步讲怎么实现,完全不用序列化类,纯遍历XML就能搞定,非常适合新手上手~
首先,你需要注意这个XML带有命名空间(http://library.org),这是关键,不处理的话会找不到对应的节点。下面是两种简单的实现方式,推荐用第一种LINQ to XML的写法,更简洁直观。
方法一:使用LINQ to XML(推荐)
先引用必要的命名空间:
using System; using System.Linq; using System.Xml.Linq;
然后编写核心代码,注释已经写得很清楚了:
// 假设这是你从Web服务获取到的XML字符串 string xmlResponse = @"<ArrayOfArrayOfString xmlns:xsi=""http://www.w3.org/2001/XMLSchema-instance"" xmlns:xsd=""http://www.w3.org/2001/XMLSchema"" xmlns=""http://library.org""> <ArrayOfString> <string>1</string> <string>Jack</string> <string>The Alchemist</string> </ArrayOfString> <ArrayOfString> <string>2</string> <string>Henry</string> <string>The Catcher In The Rye</string> </ArrayOfString> </ArrayOfArrayOfString>"; // 把XML字符串加载成XDocument对象 XDocument doc = XDocument.Parse(xmlResponse); // 定义XML的命名空间,必须和XML里的xmlns属性值完全一致 XNamespace ns = "http://library.org"; // 遍历每一个ArrayOfString节点 foreach (var arrayNode in doc.Descendants(ns + "ArrayOfString")) { // 取出当前节点下所有string子节点的内容,用空格拼接成一行 string resultLine = string.Join(" ", arrayNode.Elements(ns + "string").Select(s => s.Value)); // 打印拼接后的行 Console.WriteLine(resultLine); }
关键说明:
- 命名空间:XML里的所有元素都属于
http://library.org这个命名空间,所以查找节点时必须带上这个命名空间(ns + "节点名"),否则会找不到节点。 string.Join:用来把多个字符串拼接成一行,你可以把空格换成逗号、制表符等,比如string.Join(", ", ...)就能用逗号分隔内容。Elements(ns + "string"):只查找当前ArrayOfString节点的直接子节点string,比Descendants更精准,效率也更高。
方法二:使用XmlDocument(传统DOM方式)
如果你更习惯用老的XmlDocument写法,也可以这样做:
using System; using System.Xml; // 同样是你的XML字符串 string xmlResponse = @"<ArrayOfArrayOfString xmlns:xsi=""http://www.w3.org/2001/XMLSchema-instance"" xmlns:xsd=""http://www.w3.org/2001/XMLSchema"" xmlns=""http://library.org""> <ArrayOfString> <string>1</string> <string>Jack</string> <string>The Alchemist</string> </ArrayOfString> <ArrayOfString> <string>2</string> <string>Henry</string> <string>The Catcher In The Rye</string> </ArrayOfString> </ArrayOfArrayOfString>"; XmlDocument doc = new XmlDocument(); doc.LoadXml(xmlResponse); // 定义命名空间管理器,添加XML的命名空间 XmlNamespaceManager nsManager = new XmlNamespaceManager(doc.NameTable); nsManager.AddNamespace("lib", "http://library.org"); // 查找所有ArrayOfString节点 XmlNodeList arrayNodes = doc.SelectNodes("//lib:ArrayOfString", nsManager); foreach (XmlNode arrayNode in arrayNodes) { string line = ""; // 遍历当前节点下的所有string子节点 foreach (XmlNode stringNode in arrayNode.SelectNodes("lib:string", nsManager)) { line += stringNode.InnerText + " "; } // 去掉末尾多余的空格,然后打印 Console.WriteLine(line.Trim()); }
运行上面任意一段代码,都会输出:
1 Jack The Alchemist 2 Henry The Catcher In The Rye
内容的提问来源于stack exchange,提问作者Chainsw
相关产品推荐
相关产品推荐

