我正在开发一个项目,我有一个在线解决方案,您可以上传xml文件并将xml中的数据解析到数据库。这些文件现在可以达到1GB大,我的解决方案必须能够处理这个,这给我带来了一些困难,原因很明显。我的想法是将数据以块的形式发送到数据库。
以下是xml文件外观的一个小例子
<BPM6 language="english" submissionType="normal" version="14">
<masterdata tlf="" by="" postnr="" gadenavn="" firmanavn="" loebenr=""
refperio="201711" idno="61092919">
<kontaktpersoner>
<person fuldtnavn="Morten Nystrup Rasmussen" tlf=""
email="mnr@nationalbanken.dk" />
</kontaktpersoner>
</masterdata>
<AK1>
<AK1MedIsin>
<data Isin="123" Koncern="D" Valuta="ANG" VPreg="J"/>
<data Isin="123" Koncern="D" Valuta="ANG" VPreg="J"VaerdiPrincip="M"Fritekst="
" />
<data Isin="123" Koncern="D" Valuta="ANG" VPreg="J" VaerdiPrincip="M" Fritekst="
" />
<data Isin="123" Koncern="D" Valuta="ANG" VPreg="J" VaerdiPrincip="M" Fritekst="
" />
<data Isin="123" Koncern="D" Valuta="ANG" VPreg="J" VaerdiPrincip="M" Fritekst="
" />
<data Isin="123" Koncern="D" Valuta="ANG" VPreg="J" />
<data Isin="123" Koncern="D" Valuta="ANG" VPreg="J"VaerdiPrincip="M"/>
<data Isin="123" Koncern="D" Valuta="ANG" VPreg="J"VaerdiPrincip="M"/>
<data Isin="123" Koncern="D" Valuta="ANG" VPreg="J"VaerdiPrincip="M"/>
<data Isin="123" Koncern="D" Valuta="ANG" VPreg="J" VaerdiPrincip="M" />
</AK1MedIsin>
</AK1>
<OB2a>
<OB2aUdenIsin>
<data InternKode="3" Branche="BZ2" Sektor="1120"/>
<data InternKode="4" Branche="BZ2" Sektor="1120"/>
<data InternKode="5" Branche="BZ2" Sektor="1120"/>
<data InternKode="6" Branche="BZ2" Sektor="1120"/>
<data InternKode="7" Branche="BZ2" Sektor="1120"/>
</OB2aUdenIsin>
</OB2a>
</BPM6>
完整的xml文件显然要大得多。我的主要问题是我必须读取节点“AK1MedIsin”和“OB2aUdenIsin”中的数据,这些名称是未知的,并且将在不同文件之间进行更改。
using (var reader = XmlTextReader.Create(File.OpenRead(@"C:\data.xml")))
{
var state = State.PreMasterData;
if (reader.MoveToContent() == XmlNodeType.Element)
{
while (reader.Read())
{
switch (state)
{
case State.PreMasterData:
if (reader.Name == "masterdata")
{
var masterDatastring = ReadMasterData(reader);
state = State.PostMasterData;
break;
}
break;
case State.PostMasterData:
//Read chunks of the data of the child notes of BPM6
break;
}
}
}
}
读取MasterData不是问题,因为该名称始终相同。所以我可以使用xpath或reader.name来转到笔记并逐一阅读这些行。但是,当我不知道节点的名称时,如何做到这一点对我来说很难。我试图使用方法reader.ReadSubtree(),但这似乎不可能。