.NET操作XML小结
来源:互联网 发布:知名的中文域名案例 编辑:程序博客网 时间:2024/04/28 08:00
这篇主要讲讲如何使用XmlDocument配合XPath进行XML的操作,有关XmlDocument和XPath的更多信息,请参考MSDN(http://msdn.microsoft.com/zh-cn/library/system.xml.xmldocument(VS.80).aspx和http://msdn.microsoft.com/zh-cn/library/ms256471(VS.80).aspx)以及 W3C(http://www.w3.org/TR/xpath)
XPath主要的作用是用来查找符合条件的节点的,对于复杂的XML来说那是相当的有用,所以掌握XPath的语法还是非常重要的
下面举几个简单的例子来说明一下。例如有XML文件如下:
- <?xml version="1.0" encoding="utf-8"?>
- <Root>
- <NodeTest id="0">1</NodeTest>
- <NodeTest id="1">2</NodeTest>
- </Root>
使用如下代码就可以创建该文件:
- XmlDocument doc = new XmlDocument();
- XmlDeclaration xd = doc.CreateXmlDeclaration("1.0", "utf-8", null);
- doc.AppendChild(xd);
- XmlElement root = doc.CreateElement("Root");
- doc.AppendChild(root);
- for (int i = 0; i < 2; i++)
- {
- XmlElement nodeTest = doc.CreateElement("NodeTest");
- nodeTest.InnerText = Convert.ToString(i + 1);
- XmlAttribute xa = doc.CreateAttribute("id");
- xa.Value = i.ToString();
- nodeTest.Attributes.Append(xa);
- root.AppendChild(nodeTest);
- }
- doc.Save("e://1.xml");
下面我们来说说如何使用XPath进行查询
如果我要找到id为1的NodeTest的节点,那么我们应该使用如下代码
- XmlDocument doc = new XmlDocument();
- doc.Load(filePath);
- XmlNode node = doc.SelectSingleNode("/Root/NodeTest[@id='1']");
删除节点很简单,调用RemoveChild方法就可以了,例如上面删除找到的节点,那么使用如下代码
- node.ParentNode.RemoveChild(node);
- doc.Save(filePath);
修改节点的名称,貌似MS没有提供方法,所以一般来说只能先删除在添加
简单的增删改查已经说完了,下面说说带有命名空间的XML的操作
所谓XML的命名空间,有关更详细的信息,请参考MSDN(http://msdn.microsoft.com/zh-cn/library/c1a6xs06(VS.80).aspx)
这里主要会用到XmlNamespaceManager这个类,有关这个类的详细信息,请参考MSDN(http://msdn.microsoft.com/zh-cn/library/system.xml.xmlnamespacemanager(VS.80).aspx)
假设有如下XML
- <?xml version="1.0" encoding="utf-8"?>
- <Root xmlns="http://www.w3.org">
- <NodeTest id="0">1</NodeTest>
- <NodeTest id="1">2</NodeTest>
- </Root>
使用上面的查找代码你会发现node为null,为什么会出现这种情况呢?那就是命名空间在作怪,此时应该使用如下代码来获取节点
- XmlDocument doc = new XmlDocument();
- doc.Load(filePath);
- XmlNamespaceManager nm = new XmlNamespaceManager(doc.NameTable);
- nm.AddNamespace("uu", "http://www.w3.org");
- XmlNode node = doc.SelectSingleNode("/uu:Root/uu:NodeTest[@id='1']", nm);
另外在操作XML的时候,会碰到合并两个XML文档的操作,此时可以利用InnerXml和OuterXml两个属性,直接拼接字符串,这样就避免了过多的节点操作
假设有如下两个XML
- <?xml version="1.0" encoding="utf-8"?>
- <Root>
- <NodeTests>
- <NodeTest id="0">1</NodeTest>
- <NodeTest id="1">2</NodeTest>
- </NodeTests>
- <CombinNode></CombinNode>
- </Root>
- <Dictrionary>
- <A>
- <Dic name="Aa" />
- <Dic name="Ac" />
- <Dic name="Awa" />
- </A>
- <DDD>
- <Dic name="Ba" />
- <Dic name="Bc" />
- <Dic name="Bz" />
- </DDD>
- </Dictrionary>
想要合并后得到如下的XML
- <?xml version="1.0" encoding="utf-8"?>
- <Root>
- <NodeTests>
- <NodeTest id="0">1</NodeTest>
- <NodeTest id="1">2</NodeTest>
- </NodeTests>
- <CombinNode>
- <A>
- <Dic name="Aa" />
- <Dic name="Ac" />
- <Dic name="Awa" />
- </A>
- <DDD>
- <Dic name="Ba" />
- <Dic name="Bc" />
- <Dic name="Bz" />
- </DDD>
- </CombinNode>
- </Root>
那么使用如下代码就可以了
序列化是将对象状态转换为可保持或传输的格式的过程。与序列化相对的是反序列化,它将流转换为对象。这两个过程结合起来,可以轻松地存储和传输数据。.NET Framework 提供两种序列化技术:二进制序列化和XML、SOAP序列化(引自MSDNhttp://msdn.microsoft.com/zh-cn/library/7ay27kt9(VS.80).aspx)
把对象转换为XML文档的过程称为对象的XML序列化。
把XML文档恢复为对象的过程称为对象的XML反序列化。
XML序列化的应该很广泛,典型的有数据的传输或者动态数据的保存或者简单格式的XML操作,提到XML序列化,有个类肯定是跑不掉的,那就是XmlSerializer,这个类可以将对象序列化到 XML 文档中和从 XML 文档中反序列化对象。有关XmlSerializer的更多信息请参考MSDN(http://msdn.microsoft.com/zh-cn/library/system.xml.serialization.xmlserializer(VS.80).aspx)
下面举几个简单的例子来说明下如何使用XmlSerializer来操作XML
假设有如下XML
- <?xml version="1.0" encoding="utf-8"?>
- <Root>
- <OutputPath></OutputPath>
- <InitialDirectory></InitialDirectory>
- <Configs>
- <Config DisplayName="">
- <UserName></UserName>
- <PassWord></PassWord>
- <Path></Path>
- <ProjectPath></ProjectPath>
- </Config>
- <Config DisplayName="">
- <UserName></UserName>
- <PassWord></PassWord>
- <Path></Path>
- <ProjectPath></ProjectPath>
- </Config>
- </Configs>
- </Root>
我们需要建两个类
- [Serializable]
- public class Config
- {
- [NonSerialized]
- private string displayName = String.Empty;
- [XmlAttribute("DisplayName")]
- public string DisplayName
- {
- get { return displayName; }
- set { displayName = value; }
- }
- [NonSerialized]
- private string userName = String.Empty;
- [XmlElement("UserName")]
- public string UserName
- {
- get { return userName; }
- set { userName = value; }
- }
- [NonSerialized]
- private string passWord = String.Empty;
- [XmlElement("PassWord ")]
- public string PassWord
- {
- get { return passWord; }
- set { passWord = value; }
- }
- [NonSerialized]
- private string path = String.Empty;
- [XmlElement("Path")]
- public string Path
- {
- get { return path; }
- set { path = value; }
- }
- [NonSerialized]
- private string projectPath = String.Empty;
- [XmlElement("ProjectPath")]
- public string ProjectPath
- {
- get { return projectPath; }
- set { projectPath = value; }
- }
- }
- [Serializable]
- [XmlRoot("Root")]
- [XmlInclude(typeof(Config))]
- public class SerializeConfigs
- {
- [NonSerialized]
- private string outputPath = String.Empty;
- [XmlElement("OutputPath")]
- public string OutputPath
- {
- get { return outputPath; }
- set { outputPath = value; }
- }
- [NonSerialized]
- private string initialDirectory = String.Empty;
- [XmlElement("InitialDirectory")]
- public string InitialDirectory
- {
- get { return initialDirectory; }
- set { initialDirectory = value; }
- }
- [NonSerialized]
- private List<Config> configs = new List<Config>();
- [XmlArrayItem("Configs", typeof(Config), ElementName = "Config")]
- public List<Config> Configs
- {
- get { return vssConfigs; }
- set { vssConfigs = value; }
- }
- }
对上面的两个类做个简单的说明:
1、你想执行序列化的类必须声明Serializable属性
2、在XML序列化中你可以使用NonSerialized或者XmlIgnore属性来决定某个Filed是否被序列化
3、如果该Filed是XML节点的属性的话,请使用XmlAttribute
4、通过Attribute可以使类中的字段名称与XML节点名称不一致
好了,准备工作都做完了,下面让我们看看具体的代码吧
- private void Serialize()
- {
- SerializeConfigs configs = new SerializeConfigs();
- XmlSerializer mySerializer = new XmlSerializer(typeof(SerializeConfigs));
- StreamWriter myWriter = new StreamWriter(filePath);
- XmlSerializerNamespaces xmlns = new XmlSerializerNamespaces();
- xmlns.Add(String.Empty, String.Empty);
- mySerializer.Serialize(myWriter, configs, xmlns);
- myWriter.Close();
- }
- private SerializeConfigs Deserialize()
- {
- XmlSerializer mySerializer = new XmlSerializer(typeof(SerializeConfigs));
- FileStream myFileStream = new FileStream(filePath, FileMode.Open);
- SerializeConfigs configs = mySerializer.Deserialize(myFileStream) as SerializeConfigs;
- myFileStream.Close();
- return configs;
- }
这个例子只是最简单的一种,有兴趣的朋友可以参考MSDN的System.Xml.Serialization命名空间下的成员,有很多Attribute供我们使用(http://msdn.microsoft.com/en-us/library/system.xml.serialization.aspx)
当然如果你觉得XmlSerializer不能满足你的要求的话,你可以继承XmlSerializer、XmlSerializationReader以及XmlSerializationWriter,实现自己的XmlSerializer
- .net 操作XML小结
- .NET操作XML小结
- .net 操作XML小结
- .net 操作XML小结
- .net操作xml小结
- .net 操作XML小结
- .net 操作XML小结
- .net操作XML小结
- .net 操作XML小结
- net 操作XML小结
- .net操作xml小结
- .net操作xml小结
- .net 操作XML小结
- .net 操作XML小结
- .net 操作XML小结
- asp.net操作xml小结
- asp.net操作xml小结
- c#net操作xml小结
- Java 继承 - 字段不能被覆盖
- GridView行的单击/双击事件
- 手机开发项目的具体实例
- 计算机专业的发展方向
- 多线程数据共享的方法
- .NET操作XML小结
- c++ 多线程 写法
- 我的嵌入式学习感悟,和学弟学妹们分享
- 并查集
- 联想售后服务偷换主板
- u 盘测试USB bulkusb驱动问题
- 比较好的堆栈详解
- AF_INET和PF_INET的细微不同
- C语言18个经典问题答录