You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#使用XmlDocument解析XML时获取属性值错误的问题

C#解析XML属性值串读问题

我在使用C#解析XML文件时,最初编写的节点遍历代码如下:

foreach (XmlNode node in dataNodes) 
{
    if (node.SelectSingleNode(@".//Imetnik").Attributes["matSub"] != null)
    {
        maticna = node.SelectSingleNode(@".//Imetnik").Attributes["matSub"].Value;
    }

    if (node.SelectSingleNode(@".//Imetnik").Attributes["davcna"] != null)
    {
        davcna = node.SelectSingleNode(@".//Imetnik").Attributes["davcna"].Value;
    }

    if (node.Attributes["iban"] != null && node.Attributes["rn"] != null)
    {
        iban = node.Attributes["iban"].Value;
        trr = node.Attributes["rn"].Value.Insert(5, "-");
    }
    
    if (node.Attributes["sSpre"] != null)
    {
        sifra_spremembe = node.Attributes["sSpre"].Value;
    }

    if (node.Attributes["dSpre"] != null)
    {
        datum_od = node.Attributes["dSpre"].Value;
    }

    if (node.Attributes["dOdprt"] != null)
    {
        datum_odprtja_racuna = node.Attributes["dOdprt"].Value;
    }

    if (node.Attributes["dZaprt"] != null)
    {
        datum_zaprtja_racuna = node.Attributes["dZaprt"].Value;
    }

    //.... 执行数据库表插入逻辑 ....
}

运行时出现属性读取异常:遍历到第一个不存在dZaprt属性的节点时,程序不会给对应字段赋空值,反而会读取到后续第一个包含该属性的节点的属性值,最终写入的数据出现错位。
对应的XML节点结构如下:

<?xml version="1.0" encoding="UTF-8"?>
<RtrPod>
    <!-- 无dZaprt属性的节点 -->
    <Tr rn="99999999" vr="T" sSpre="S" reg="P" dSpre="2022-06-17" dOdprt="2017-06-23" iban="5555" vir="B" maticnaPps="999999999">
        <PopolnoImeRacuna>XXXXXXXXXXXXXXXXXXXX</PopolnoImeRacuna>
        <KratkoImeRacuna>XXXXXXXXXXXXXXXXXXXX</KratkoImeRacuna>
        <Imetnik davcna="11111111" matSub="11111111" drz="111" ak="A" reg="P" vrsta="I">
            <PopolnoIme>XXXXXXXXXXXXXXXXXXXX</PopolnoIme>
            <KratkoIme>XXXXXXXXXXXXXXXXXXXX</KratkoIme>
            <Naslov sifTipNaslova="33" sifDrzava="333" sifObcina="333" sifPosta="33333" sifUlica="3333" sifNaselje="3333" stHisna="333" dodatek="C" sifHsmid="3333333">
                <Drzava>XXXXXXXX</Drzava>
                <Obcina>XXXXXXXX</Obcina>
                <Posta>XXXXXXXX</Posta>
                <Ulica>XXXXXXXX</Ulica>
                <Naselje>XXXXXXXX</Naselje>
            </Naslov>
        </Imetnik>
    </Tr>
    <!-- 带dZaprt属性的节点 -->
    <Tr rn="555555555" vr="T" sSpre="Z" reg="P" dSpre="2022-06-17" dOdprt="2002-06-30" dZaprt="2022-06-17" iban="5555" vir="B" maticnaPps="5555555">
        <Imetnik matSub="555555" drz="555" ak="N" reg="P" vrsta="I">
            <PopolnoIme>XXXXXXXXXXXXXXXXXXXX</PopolnoIme>
            <KratkoIme>XXXXXXXXXXXXXXXXXXXX</KratkoIme>
            <Naslov sifTipNaslova="444" sifPosta="44444">
                <Posta>XXXXXXXXXXXXXXXXXXXX</Posta>
            </Naslov>
        </Imetnik>
    </Tr>
</RtrPod>

最后采纳了评论区的建议,使用LINQ重写全部解析逻辑后,问题解决。

内容的提问来源于stack exchange,提问作者user3787774

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 00:32:22