在C#或python中使用xpath解析xml

  • A+
所属分类:.NET技术
摘要

记几个笔记文件后缀不一定要.xml,可以是任意后缀,只要内容是符合xml和格式即可解析出来

记几个笔记

文件后缀不一定要.xml,可以是任意后缀,只要内容是符合xml和格式即可解析出来

文件编码需要是utf-8,python和c#都需要,或者xml文件头有这样一句:<?xml version="1.0" encoding="utf-8"?>

一些比较复杂的文件,如果按照从上往下一层一层节点来解析,那么比较麻烦,但是通过xpath,指定节点来解析,那么就方便多了。

xml文件示例

<root> 	<space> 		<name>	江南	</name> 		<subzone> 			<zone> 				<name>	桃溪	</name> 				<ambient>	jiangnan/forest_05	</ambient> 				<music>	Zone/xxxx1	</music> 			</zone> 			<zone> 				<name>	木渎镇	</name> 				<ambient>	jiangnan/muduzheng	</ambient> 				<music>	Jn_2/xxxx2	</music> 			</zone> 			<!--....还有很多zone !--> 		<subzone>         <music>	Space/Jiangnan_xxx	</music> 		<ambient>	function/amb_wind	</ambient> 	<space> </root>	 

C#版本解析

重要的点就是通过node.SelectSingleNode来选择要的节点。

var xmldoc = new XmlDocument(); var xmlReader = XmlReader.Create(def_path); xmldoc.Load(xmlReader); var nodeList = xmldoc.FirstChild.ChildNodes; Console.WriteLine($"读入xml,节点数:{nodeList.Count}"); StringBuilder builder = new StringBuilder(); builder.AppendLine($"场景chunk名称,音乐名,环境底噪,所属大区"); //场景chunk名称 文件夹名 资源名  foreach (XmlNode node in nodeList) { 	if (node.Name != "space") 	{ 		Console.WriteLine("遇到特殊节点,未解析"); 		continue; 	} 	var subzone = node.SelectSingleNode("subzone"); 	var name = node.SelectSingleNode("name"); 	var music = node.SelectSingleNode("music"); 	var ambient = node.SelectSingleNode("ambient");  	//....处理第1层节点的数据  	if (subzone != null) 	{ 		var zones = subzone.ChildNodes; 		foreach (XmlLinkedNode ccNode in zones) 		{ 			var name1 = ccNode.SelectSingleNode("name"); 			var music1 = ccNode.SelectSingleNode("music"); 			var ambient1 = ccNode.SelectSingleNode("ambient"); 			var subzone1 = ccNode.SelectSingleNode("subzone"); 			//..... 处理第2层节点的数据 			//note 如果还有子子节点的话,需要再次处理 			if (subzone1 != null) 			{ 				Console.WriteLine($"第2层之后还有subzone, name:{tunkName} ,未解析"); 			} 		} 	} } 

python版本解析

python解析xml的文档:https://docs.python.org/zh-cn/2.7/library/xml.etree.elementtree.html

示例:

import xml.etree.ElementTree as ET if __name__ == '__main__': 	xml_path = r"D:xxxscene.xml" 	tree = ET.parse(xml_path) 	root = tree.getroot() 	for child in root: 		childs = child.getchildren() 		print(childs,child.tag,child.text) 		if child.tag == "space" and child.text and child.text: 			pass