发现在使用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 (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方法都有重载方法支持添加命名空间。
本文地址:https://blog.csdn.net/devnn/article/details/107515608
如对本文有疑问, 点击进行留言回复!!
Mobilenetv3-ssd训练VOC格式数据集loss出现nan:数据本身出现问题
Android PackageManagerService(二)下载安装详解
Asp.Net Core 3.1 Web Api 返回数据字段被转换为小驼峰格式的解决办法
已知两点经纬度,计算偏移角(正北为0,顺时针为正,逆时针为负)
解决问题“Could not load file or assembly xxxxxxx or one of its dependencies”
网友评论