将XML数据读取到具有未知名称的子组件,并将其解析为字符串

时间:2017-10-26 12:21:38

标签: c# xml

我正在开发一个项目,我有一个在线解决方案,您可以上传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="&#xD;" />
      <data Isin="123" Koncern="D" Valuta="ANG" VPreg="J" VaerdiPrincip="M" Fritekst="&#xD;" />
      <data Isin="123" Koncern="D" Valuta="ANG" VPreg="J" VaerdiPrincip="M" Fritekst="&#xD;" />
      <data Isin="123" Koncern="D" Valuta="ANG" VPreg="J" VaerdiPrincip="M" Fritekst="&#xD;" />
      <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(),但这似乎不可能。

0 个答案:

没有答案