【问题标题】:Parse XML nodes to an array将 XML 节点解析为数组
【发布时间】:2017-09-11 16:38:14
【问题描述】:

我想从下面的 XML 中获取元素 ROW 的所有属性的数组

<?xml version="1.0" encoding="windows-1251"?>
<DATAPACKET Version="2.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.seavus.com/AML/XML-Schema/CTR_Single.xsd">
  <banka>
    <!-- banka children -->
  </banka>
  <METADATA>
    <FIELDS>
      <!-- Fields -->
    </FIELDS>
    <PARAMS LCID="0" />
  </METADATA>
  <ROWDATA>
    <ROW BANK_ID="370" AKTIVNOST_SE_VRSI_VO_19="Г" NAZIV_21="XXXXX" SEDISTE_21="XX" DANOCEN_BROJ_21="12333" BROJ_SMETKA_21="123333" BANKA_21="330" DATUM_22="03.01.2017" CAS_22="13:30" VID_AKTIV_23="XXX" IZNOS_24="12" VALUTA_24="807" DATUM_25="04.01.2017"
      VREME_25="12:55" SIFRA_26="800" OPIS_27="XXXXXXX" />
  </ROWDATA>
</DATAPACKET>

说清楚,我想从这个节点做一个数组:

<ROW BANK_ID="370" AKTIVNOST_SE_VRSI_VO_19="Г" NAZIV_21="XXXXX" SEDISTE_21="XX" DANOCEN_BROJ_21="12333" BROJ_SMETKA_21="123333" BANKA_21="330" DATUM_22="03.01.2017" CAS_22="13:30" VID_AKTIV_23="XXX" IZNOS_24="12" VALUTA_24="807" DATUM_25="04.01.2017"
  VREME_25="12:55" SIFRA_26="800" OPIS_27="XXXXXXX" />

我想用这个数组来生成插入查询。

到目前为止我所尝试的:

doc.Load(path);
ArrayList list = new ArrayList();
XmlNode idNodes = doc.SelectSingleNode("DATAPACKET/ROWDATA/ROW");
foreach (XmlNode node1 in idNodes.Attributes)
{
    list.Add(node1.InnerText);
}

我有从我的 XML 在线生成的类,我正在使用它们来反序列化我的 XML 文件。

【问题讨论】:

  • 一组什么?字符串,只有那些字段名称?或者你想要一个包含键值对的数组?
  • 是的,只有具有这些字段名称的字符串
  • 什么是DATAROW?我在您的 xml 中看到一个 DATAPACKET 但没有 DATAROW
  • 我的错误解决了问题
  • ROW 没有子节点。你是说属性吗?

标签: c# arrays xml linq-to-xml


【解决方案1】:

您可以为名称-值对创建字典。使用 Linq2Xml:

(不要忘记默认的 XmlNamespace)

var xDoc = XDocument.Parse(xmlstring);
XmlNamespaceManager mgr = new XmlNamespaceManager(xDoc.CreateNavigator().NameTable);
mgr.AddNamespace("ns", "http://www.seavus.com/AML/XML-Schema/CTR_Single.xsd");

var dict = xDoc.XPathSelectElement("//ns:ROWDATA/ns:ROW",mgr)
                .Attributes()
                .ToDictionary(a => a.Name, a => a.Value);

返回的字典将是:

BANK_ID: 370
AKTIVNOST_SE_VRSI_VO_19: Г
NAZIV_21: XXXXX
SEDISTE_21: XX
DANOCEN_BROJ_21: 12333
BROJ_SMETKA_21: 123333
BANKA_21: 330
DATUM_22: 03.01.2017
CAS_22: 13:30
VID_AKTIV_23: XXX
IZNOS_24: 12
VALUTA_24: 807
DATUM_25: 04.01.2017
VREME_25: 12:55
SIFRA_26: 800
OPIS_27: XXXXXXX

【讨论】:

    【解决方案2】:

    您的主要问题是您选择了错误的命名空间。当然,也没有可供选择的 DATAROW。

    这似乎有效:

    doc.Load(yourPath);
    var list = new ArrayList();
    XmlNamespaceManager mgr = new XmlNamespaceManager(doc.CreateNavigator().NameTable);
    mgr.AddNamespace("ns", "http://www.seavus.com/AML/XML-Schema/CTR_Single.xsd");
    var idNodes = doc.DocumentElement?.SelectSingleNode("ns:ROWDATA/ns:ROW", mgr);
    foreach (XmlNode attr in idNodes.Attributes)
        list.Add(attr.Name);
    

    【讨论】:

    • 谢谢,是否可以向这个数组列表添加键和值?
    • mgr ns doc.CreateNavigator().NameTable 和我的很像
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多