2 用Dom的方式创建/修改xml
上一篇讲了如何用dom的方式读一个xml,这一篇就讲一下如何用dom的方式去写一个xml。不过,用dom的写Xml本身并不是一个好主意,因为Dom方式本身的废话超多,做一个简单的事情就需要好几句语句,但是作为一个基本的方式还是有必要了解一下的。
2.1 用Dom的方式去创建xml
如果想写出这样一个xml:
那么你可能需要这样一大段代码:
分析一下,在dom方式下要创建任何一个xml的节点都必须要使用XmlDocument的对应的Create方法创建,然后再添加到对应的位置,这也就是Dom方式最麻烦的地方。
看看运行结果:
这个xml和我们期望的xml是等价的,只是没有被格式好,好吧,想要一个格式化好的文档,那么就修改一下写xml的部分(在讲xmlwriter的时候还会讲到这个setting类):
再看看运行结果:
这样就和期望的xml一致了。
2.2 用Dom的方式去创建有namespace的xml
如果有namespace的xml怎么创建哪?
其实也很简单,换一个重载就可以了,在创建节点的时候用带有namespace的重载就可以了:
再看一下结果:
2.3 用Dom的方式去修改xml
修改xml其实也无非就是读取xml然后再做必要的增删改。
在修改之前,首先当然就是要定为到xml的节点,这个在第一篇里面已经讲过。
如果所做的修改是添加节点那么基本上就和上一节的内容相似:
在原来这个xml的基础上添加一个person——Allen Lee,可以看到几乎就是把第一篇的读xml和前一节的创建xml结合起来,开看看运行结果吧:
那么删除节点怎么办哪?
例如,要从已经有多个Person的xml中,删除凡是FirstName叫Allen的Person,就可以这样写:
注意,这里用了个XPath去查询所有的FirstName叫Allen的Person,也就是:
/v:persons/v:person[v:firstName='Allen']
v是namespace,之前用已经解释过了,这个XPath要找的是根节点里面的(/)persons节点(v:persons)里面的(/)person节点(v:person),那么[]在这里是什么意思哪?[]中间的部分代表条件约束,或者说是where,前面的XPath部分已经选择person节点,现在对找到的Person做个条件约束,条件的内容是firstname的值需要是Allen(v:firstName=’Allen’)。
通过上面的这个XPath就可以定位到一个节点集,c#中为XmlNodeList类型,里面有一系列的节点(例子中为1个),然后将他移除即可,不过该死的Dom Api需要在父节点中删除这个节点,也就是不得不用这种很恶心的写法:
node.ParentNode.RemoveChild(node);
修改就暂时讲到这里,其他类型的修改由于比较简单,就展开再说了。
看到这里,想必读者也知道如何操作xml了,但是,Dom Api的繁琐写法确实非常影响工作效率,下一篇,将进入Linq to Xml时代,来看看新的Api带来的巨大的工作效率的提升。