C# XmlDocument ürítése nagyon sokáig tart

C# XmlDocument ürítése nagyon sokáig tart
2013-07-11T13:20:47+02:00
2013-07-11T13:49:33+02:00
2022-11-29T09:05:41+01:00
Tu Ati
Sziasztok

Segítséget szeretnék kérni egy XmlDocument ürítésével kapcsolatban.
Van egy adatlap kitöltő programom, ami egy xml fájlt hoz létre a következő tartalommal:

<dataSheets> <dataSheet name="Fejléc" version="2013-07-01"> <data name="EL131100" convert="0" label="EL131100" value="123455564" /> <data name="EL132100" convert="0" label="EL132100" value="99" /> . . </dataSheet> <dataSheet name="adatlaprész1" version="2013-07-01"> <data name="AL121300" convert="0" label="AL121300" value="2013.12.31." /> <data name="AL121420" convert="0" label="AL121420" value="10" /> . . </dataSheet> <dataSheet name="adatlaprész2" version="2013-07-01"> <data name="PT112000" convert="0" label="PT112000" value="" /> <data name="PT113000" convert="0" label="PT113000" value="1" /> . . </dataSheet> <dataSheet name="Lábléc" version="2013-07-01"> <data name="AL123130" convert="0" label="AL123130" value="2012.12.15." /> <data name="EL131500" convert="0" label="EL131500" value="27-3165" /> . . </dataSheet> </dataSheets>

Az adatlaprész1 és 2-ből több is lehet a fájlban. Az esetek többségében 4-5-nél több nincs egy fájlban. Van olyan xml fájl amiben viszont pl. 150 is előfordul, így az xml fájlban a sorok száma kb. 7000

Ezt a fájlt amikor megnyitom a programban és módosítás után bezárom és egy másikat akarok szerkeszteni/létrehozni akkor van a következő kódrészletben jelzett helyen a probléma:

using System; using System.Xml; ... namespace adatlapKitolto { public partial class baseForm : Form { XmlDocument xmldocReportDocument = new XmlDocument(); ... public baseForm() { ... xmldocReportDocument.InnerXml = "<dataSheets/>"; //ez egy értékadás, a még üres XmlDocument-nek, ezzel nincs gond ... } private void tsbOpen_Click(object sender, EventArgs e) //eszköztáron lévő fájl megnyitás gomb eljárása { string strInnerXml = string.Empty; ofdOpen.FileName = string.Empty; DialogResult dreOpenFile = ofdOpen.ShowDialog(); if (!string.IsNullOrEmpty(ofdOpen.FileName)) { StreamReader strOpen = new StreamReader(ofdOpen.FileName); strInnerXml = strOpen.ReadToEnd(); strOpen.Close(); strOpen = null; xmldocReportDocument.InnerXml = strInnerXml; // az adatok betöltése az XmlDocument-be ... } ... } private void tsb_close_Click(object sender, EventArgs e) //eszköztáron lévő adatlap bezárás gomb { ... closeDocument(); ... } private void closeDocument() { ... // mindenféle változók alaphelyzetbe állítása xmldocReportDocument.InnerXml = "<dataSheets/>"; /* ITT VAN A PROBLÉMA: itt az egyszerű értékadásnál 5 perc is eltelik az előbb említett 7000 soros fájlnál, eddig ez nem jelentkezett, mivel nem kaptunk ilyen "sok" soros xml adatlapot. Miért vár ennyit a program az objektum InnerXml tulajdonságának felülírásával? Lehet-e más módon üríteni az InnerXml-t és a fenti értéket adni? Ebben kérném a segítségeteket... */ } } }

Előre is köszönöm a válaszaitokat: TuAti
Mutasd a teljes hozzászólást!
A törölgetés helyett egyszerűen példányosítsd újra szegényt.
xmldocReportDocument = new XmlDocument();
Aztán a GC elvégzi a többit.
Mutasd a teljes hozzászólást!

  • Amikor a sebességgel van gond arra általában gyógyírt szokott jelenteni a Linq. Neki is vannak XML-t kezelő osztályi. Nem is sokban különbözik a neve: XDocument.

    Itt egy kis példakód:
    #region ReadOnlyFields readonly string configPath = Environment.CurrentDirectory + "\Config.xml"; readonly string versionDeclaration = "1.0"; readonly string encodingDeclaration = "utf-8"; readonly string rootElement = "Configuration"; readonly string adapterElement = "Adapter"; readonly string adapterIpAddressAttribute = "IpAddress"; readonly string listOfElements = "Streams"; readonly string elementOfList = "Stream"; readonly string mulicastIpElement = "MulticastIp"; readonly string portElement = "Port"; readonly string destinationDirectoryElement = "DestinationDirectory"; readonly string refreshTimeElement_sec = "RefreshTime_sec"; #endregion #region Variables NetworkAdapterInformation networkAdapterInformation; List<Stream> streams = new List<Stream>(); string refreshTime_sec; #endregion public void SaveConfiguration() { XDocument document = new XDocument( new XDeclaration(this.versionDeclaration, this.encodingDeclaration, null), new XElement(this.rootElement, new XElement(this.adapterElement, this.networkAdapterInformation.Description, new XAttribute(this.adapterIpAddressAttribute, this.networkAdapterInformation.IpAddress)), new XElement(this.listOfElements, from stream in streams select new XElement(this.elementOfList, new XElement(this.mulicastIpElement, stream.MulticastIP), new XElement(this.portElement, stream.Port), new XElement(this.destinationDirectoryElement, stream.DestinationDirectory) ) ), new XElement(this.refreshTimeElement_sec, this.refreshTime_sec) ) ); document.Save(configPath); } public void LoadConfiguration() { this.streams.Clear(); XDocument config = null; try { config = XDocument.Load(configPath); } catch (XmlException xmlE) { IllegalConfigurationEvent(xmlE.Message); return; } catch (FileNotFoundException fnfE) { IllegalConfigurationEvent(fnfE.Message); return; } this.networkAdapterInformation = new NetworkAdapterInformation( config.Element(this.rootElement).Element(this.adapterElement).Value, config.Element(this.rootElement).Element(this.adapterElement).Attribute(this.adapterIpAddressAttribute).Value); foreach (var stream in config.Element(this.rootElement).Element(this.listOfElements).Elements(this.elementOfList)) { this.streams.Add( new Stream( stream.Element(this.mulicastIpElement).Value, stream.Element(this.portElement).Value, stream.Element(this.destinationDirectoryElement).Value)); } this.refreshTime_sec = config.Element(this.rootElement).Element(this.refreshTimeElement_sec).Value; }
    Mutasd a teljes hozzászólást!
  • ahogy nézem az XmlDocument-nek van Load metódusa.
    Miért nem azt használod?
    továbbá van RemoveAll metódusa is
    "Ürítésre" jobbnak tűnik

    XEelement használata az XmlDocument helyett??
    Mutasd a teljes hozzászólást!
  • Köszi szépen, a válaszod után kipróbáltam és működik

    dante:
    a RemoveAll-al próbálkoztam, de sajnos az is sokáig "működött";
    ez egy megörökölt program, az eredeti fejlesztője az XmlDocumentet használja és többet is, azt hiszem egyenlőre nem fogom átírni XElemntre, de azért köszi a tippet, meg fogok "ismerkedni" vele;
    köszi neked is a gyors választ

    Szerdzso:
    neked is köszi a gyors választ és a teljes körű megoldásodat, át fogom részletesen tanulmányozni, de vs120 megoldása most gyorsan segített

    Köszi mégegyszer mindenkinek
    Mutasd a teljes hozzászólást!
Tetszett amit olvastál? Szeretnél a jövőben is értesülni a hasonló érdekességekről?
abcd