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
相关产品推荐
相关产品推荐

