版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/iceSony/article/details/84145799
贴上读取的“向阳小学名单.xml”文件
<?xml version="1.0" encoding="UTF-8"?> <Root> <body> <school name="向阳小学"> <grade id="1" name="一年级"> <room rid="1" name="一班"> <student sid = "1101" sex = "男">赵一</student> <student sid = "1102" sex = "女">赵二</student> <student sid = "1103" sex = "女">赵三</student> <student sid = "1104" sex = "男">赵四</student> </room> <room rid="2" name="二班"> <student sid = "1201" sex = "女">钱一</student> <student sid = "1202" sex = "男">钱二</student> <student sid = "1203" sex = "男">钱三</student> </room> </grade> <grade id="2" name="二年级"> <room rid="1" name="一班"> <student sid = "2101" sex = "男">孙一</student> <student sid = "2102" sex = "女">孙二</student> <student sid = "2103" sex = "男">孙三</student> </room> <room rid="2" name="二班"> <student sid = "2201" sex = "男">赵一</student> <student sid = "2202" sex = "女">赵二</student> <student sid = "2203" sex = "男">赵三</student> <student sid = "2204" sex = "女">赵四</student> </room> </grade> </school> </body> </Root>
最近开发遇到的问题,我通过GetElementById
XmlDocument xmlDoc = new XmlDocument(); xmlDoc.Load("向阳小学名单.xml"); var node = xmlDoc.GetElementById("1"); Console.WriteLine(node.InnerText);
发现程序运行报错!
加断点发现了问题所在
获取node为空!
但终极原因是:你的id属性不被认作是ID(即使你把id改成ID依然会出现这个问题)
解因:DTD(XML的文档规范)
我们通过id获取节点返回空值
就是因为XML解析后不把属性id当做ID来获取
那我们要加上DTD规范
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE Root[ <!ELEMENT grade ANY> <!ATTLIST grade id ID #REQUIRED> ]> <Root> <body> <school name="向阳小学"> <grade id="1" name="一年级"> <room rid="1" name="一班"> <student sid = "1101" sex = "男">赵一</student> <student sid = "1102" sex = "女">赵二</student> <student sid = "1103" sex = "女">赵三</student> <student sid = "1104" sex = "男">赵四</student> </room> <room rid="2" name="二班"> <student sid = "1201" sex = "女">钱一</student> <student sid = "1202" sex = "男">钱二</student> <student sid = "1203" sex = "男">钱三</student> </room> </grade> <grade id="2" name="二年级"> <room rid="1" name="一班"> <student sid = "2101" sex = "男">孙一</student> <student sid = "2102" sex = "女">孙二</student> <student sid = "2103" sex = "男">孙三</student> </room> <room rid="2" name="二班"> <student sid = "2201" sex = "男">赵一</student> <student sid = "2202" sex = "女">赵二</student> <student sid = "2203" sex = "男">赵三</student> <student sid = "2204" sex = "女">赵四</student> </room> </grade> </school> </body> </Root>
嗯没错就是这样简洁
加上规范之后再运行代码
成功获取♪(・ω・)ノ
那么可不可以通过sid获取学生信息呢?
毕竟属性sid的值也是唯一的啊
好的那么我们接下来来修改DTD为
<!DOCTYPE Root[ <!ELEMENT student ANY> <!ATTLIST student sid ID #REQUIRED> ]>
运行结果
获取到了节点内的InnerText,完全可以:)
这样以后对于唯一确定的属性值我们有了新的获取方法
但是注意你添加的ID最好别不重复哦
如果ID不唯一
会读取第一个ID的节点
附:推荐一个在线检查软件☞ 传送门
复制粘贴你的xml文本,可以检测XML语法是否符合规范