简体   繁体   English

将XML节点解析为数组

[英]Parse XML nodes to an array

I want to get an array of all attributes from element ROW from the XML below 我想从下面的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> 

To be clear, I want to make an array from this node: 为了清楚起见,我想从该节点创建一个数组:

 <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" /> 

I want to use this array to generate insert query. 我想使用此数组来生成插入查询。

What I have tried so far: 到目前为止我尝试过的是:

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

I have classes generated online from my XML and I am using them to deserialize my XML file. 我有从XML在线生成的类,并且正在使用它们反序列化XML文件。

You can create a dictionary for name-value pairs. 您可以为名称/值对创建字典。 Using Linq2Xml : 使用Linq2Xml:

(Don't forget the default XmlNamespace) (不要忘记默认的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);

returned dictionary will be: 返回的字典将是:

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

Your main problem is that you selected from the wrong namespace. 您的主要问题是从错误的名称空间中选择的。 Also, of course, there is no DATAROW to select. 同样,当然,没有可供选择的数据行。

This seems to work: 这似乎可行:

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);

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM