【Unity3d】C#使用XmlDocument读写xml冒号节点问题

在Unity使用C#的XmlDocument处理带命名空间的XML文件时,如AndroidManifest.xml,直接操作会导致命名空间丢失。文章详细介绍了如何在创建元素和设置属性时正确指定命名空间,确保生成的节点属性完整。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题场景

笔者在开发Unity3d package时发现在使用C#的XmlDocument读写XML文件时,读写带冒号的节点时,冒号前的内容给忽略了。

举个例子,以下是AndroidManifest.xml文件的部分内容:

	<manifest xmlns:android="http://schemas.android.com/apk/res/android">
  		<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
 		<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
  		...
	</manifest>

当使用c#的XmlDocument来动态添加权限时,

一般我们会这样写:

		string amFilePath = ".../AndroidManifest.xml";
		
    	XmlDocument amXmlDocument = new XmlDocument ();
		
		amXmlDocument.Load (amFilePath);
		
		XmlNode manifestNode = amXmlDocument.SelectSingleNode ("/manifest");
		
		ArrayList permissionList = ...; 
		
	    foreach (string permissionStr in permissionList) {
	    
				XmlElement permissionElement = amXmlDocument.CreateElement ("uses-permission");
				
				permissionElement.SetAttribute ("android:name", permissionStr);
				
				manifestNode.AppendChild (permissionElement);
		}
		
		amXmlDocument.Save (amFilePath);

这样写后,最后生成的节点是这样的:

	<manifest xmlns:android="http://schemas.android.com/apk/res/android">
  		<uses-permission name="android.permission.READ_EXTERNAL_STORAGE" />
 		<uses-permission name="android.permission.WRITE_EXTERNAL_STORAGE" />
 		 ...
	</manifest>

发现name前的"android"没有了。这样当然是不对的。

正确写法

正确的写法是在创建节点时指定命名空间,这个命名空间是已经在根节点中存在的。

正确代码如下:(修改上面的foreach代码)

      foreach (string permissionStr in permissionList) {
			XmlElement permissionElement = amXmlDocument.CreateElement ("uses-permission");
			permissionElement.SetAttribute ("name", "http://schemas.android.com/apk/res/android", permissionStr);
			manifestNode.AppendChild (permissionElement);
	  }

这样生成的节点属性名称就是"android:name"。

需要注意的是,CreateELement方法和SetAttribute方法都有重载方法支持添加命名空间。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值