原始 xml 文件,其中 带****括起来的部分为我们想要插入的条目。
<?xml version="1.0" encoding="utf-8"?>
<?AutomationStudio Version=4.6.2.116?>
<Package Version="1.00.0" xmlns="http://br-automation.co.at/AS/Package">
<Objects>
<Object Type="Package">DOC</Object>
<Object Type="File" Description="Global data types">Global.typ</Object>
<Object Type="File" Description="Global variables">Global.var</Object>
**<Object Type="File" Description="From Outside Import">DisModuleInstance.var</Object>**
<Object Type="Package" Description="Global libraries">Libraries</Object>
<Object Type="DataObject" Language="Ett" Description="轴报警文件">acp10etxen</Object>
<Object Type="Package" Description="后钩轴">Hook</Object>
<Object Type="Package" Description="配方">RecipeCtrl</Object>
<Object Type="Package" Description="IP地址设定">IPset</Object>
<Object Type="Package">HwFilePreprocessing</Object>
</Objects>
</Package>
要在
<Object Type="File" Description="Global variables">Global.var</Object>
的后面插入前 xml 中被 ****括起的条目
<Object Type="File" Description="From Outside Import">DisModuleInstance.var</Object>
但是正常通过 SetAttributeValue 来操作,总是在文件保存的时候自动插入一个 Attribute,为 xmlns="" 的这样一个属性,办公室网络无法科学上网,遂百度查证,资料也不是很详细而且有些不适用。比如 linq 的 没有 .NameTable
但是怎么实现我们这个需求呢,指明要插入条目的命名空间即可,即事先声明。
创建 element 的时候即带命名空间即可。
XNamespace xmlns = @"http://br-automation.co.at/AS/Package";
XElement InsFile = new XElement(xmlns + "Object", _GVFileName);
原理是:
这里是插入条目的源码,其中 GVLocation 是获取插入的位置,是一个SingleOrDefault()
var Package = XDocument.Load(Path);
var GVLocation = (
from a in Package.Descendants()
where a.Value.Equals("Global.var")
select a
).SingleOrDefault();
if (GVLocation != null)
{
XNamespace xmlns = @"http://br-automation.co.at/AS/Package";
//添加 xmlnamespace
XElement InsFile = new XElement(xmlns + "Object", _GVFileName);
InsFile.RemoveAttributes();
InsFile.SetAttributeValue("Type", "File");
InsFile.SetAttributeValue("Description", "From Outside Import");
GVLocation.AddAfterSelf(InsFile);
Package.Save(Path);
}