【C#从入门到遛弯】第十六章 · XmlDocument.GetElementById为NULL问题&简易寻找XML唯一属性值的节点

版权声明:本文为博主原创文章,未经博主允许不得转载。 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语法是否符合规范

 

猜你喜欢

转载自blog.csdn.net/iceSony/article/details/84145799