<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[nur den Anfang einer Datei einlesen]]></title><description><![CDATA[<p>Hallo,<br />
ich würde gerne einen Tipp haben, wie ihr folgendes Problem lösen würdet:</p>
<p>Mein Programm kann verschiedene Typen von Informationstypen behandeln, die in einer XML-Datei liegen. Alle sind unterschiedlich aufgebaut</p>
<p>Bei einer Methode bekomme ich nur den Pfad zu einer solchen XML-Datei übergeben. Ich würde gerne dem Nutzer den Konfor geben, dass er nicht wählen muss, welcher Informationstyp ist.<br />
Da die XML-Dateien von anderen Stellen kommen habe ich keinen Einfluss auf den Aufbau und kann nicht sagen, dass jeder als ersten Tag &lt;Type&gt;Typename&lt;/Typ&gt; einbauen muss.<br />
Aber ich weiß wie die XML-Dateien aufgebaut sind. Jetzt dachte ich mir, ich suche nach dem ersten Tag nach dem &lt;?xml version=...?&gt; und vergleiche diesen mit denen, die ich kenne und entscheide so, was es ist.<br />
Damit dies auch bei sehr großen Dateien sehr schnell geht, will ich nicht alles einlesen, sondern nur einen Stream von vorne durchsuchen</p>
<p>Habe mir das so vorgestellt (PseudoCode):</p>
<pre><code class="language-cpp">filestream = open File on filePath
int startPosition = filestream.find(?&gt;) + 1 //damit ist sichergestellt, dass es nach dem &lt;? xml-Eintrag ?&gt; ist - was aber wenn es den nicht gibt?
std::string tagname = alles zwischen ersten &quot;&lt;&quot; und ersten &quot;&gt;&quot; ab Position startPosition
</code></pre>
<p>Dachte mir, so eine weiterführende Funktionalität könnte mir eine MFC-Klasse bieten, weshalb ich mir CStdioFile angeschaut habe. Leider hat diese nur ein eine read-Methode aber nicht ein &quot;find&quot;.</p>
<p>Nun wollte ich hier fragen, ob ihr mit so etwas Erfahrung habt und mir Tipps geben könnt (habe es bewusst nicht in das MFC-Forum geschrieben, da mir egal ist mit was ich es umsetze).</p>
<p>Danke für eure Hilfe</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/287314/nur-den-anfang-einer-datei-einlesen</link><generator>RSS for Node</generator><lastBuildDate>Thu, 20 Aug 2026 13:02:14 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/287314.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 26 May 2011 09:54:17 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to nur den Anfang einer Datei einlesen on Thu, 26 May 2011 09:54:17 GMT]]></title><description><![CDATA[<p>Hallo,<br />
ich würde gerne einen Tipp haben, wie ihr folgendes Problem lösen würdet:</p>
<p>Mein Programm kann verschiedene Typen von Informationstypen behandeln, die in einer XML-Datei liegen. Alle sind unterschiedlich aufgebaut</p>
<p>Bei einer Methode bekomme ich nur den Pfad zu einer solchen XML-Datei übergeben. Ich würde gerne dem Nutzer den Konfor geben, dass er nicht wählen muss, welcher Informationstyp ist.<br />
Da die XML-Dateien von anderen Stellen kommen habe ich keinen Einfluss auf den Aufbau und kann nicht sagen, dass jeder als ersten Tag &lt;Type&gt;Typename&lt;/Typ&gt; einbauen muss.<br />
Aber ich weiß wie die XML-Dateien aufgebaut sind. Jetzt dachte ich mir, ich suche nach dem ersten Tag nach dem &lt;?xml version=...?&gt; und vergleiche diesen mit denen, die ich kenne und entscheide so, was es ist.<br />
Damit dies auch bei sehr großen Dateien sehr schnell geht, will ich nicht alles einlesen, sondern nur einen Stream von vorne durchsuchen</p>
<p>Habe mir das so vorgestellt (PseudoCode):</p>
<pre><code class="language-cpp">filestream = open File on filePath
int startPosition = filestream.find(?&gt;) + 1 //damit ist sichergestellt, dass es nach dem &lt;? xml-Eintrag ?&gt; ist - was aber wenn es den nicht gibt?
std::string tagname = alles zwischen ersten &quot;&lt;&quot; und ersten &quot;&gt;&quot; ab Position startPosition
</code></pre>
<p>Dachte mir, so eine weiterführende Funktionalität könnte mir eine MFC-Klasse bieten, weshalb ich mir CStdioFile angeschaut habe. Leider hat diese nur ein eine read-Methode aber nicht ein &quot;find&quot;.</p>
<p>Nun wollte ich hier fragen, ob ihr mit so etwas Erfahrung habt und mir Tipps geben könnt (habe es bewusst nicht in das MFC-Forum geschrieben, da mir egal ist mit was ich es umsetze).</p>
<p>Danke für eure Hilfe</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2068941</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2068941</guid><dc:creator><![CDATA[C Anfänger]]></dc:creator><pubDate>Thu, 26 May 2011 09:54:17 GMT</pubDate></item><item><title><![CDATA[Reply to nur den Anfang einer Datei einlesen on Thu, 26 May 2011 10:15:26 GMT]]></title><description><![CDATA[<p>Ich würde einen XML Parser dazu benutzen:<br />
PugiXML<br />
RapidXML<br />
TinyXML<br />
...</p>
<p>Ev. sind einige ein wenig besser geeignet als andere, wegen der Performance.</p>
<p>Simon</p>
<p><strong>Edit:</strong><br />
Wahrscheinlich wäre eine SAX implementierung für dich geeigneter.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2068948</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2068948</guid><dc:creator><![CDATA[theta]]></dc:creator><pubDate>Thu, 26 May 2011 10:15:26 GMT</pubDate></item><item><title><![CDATA[Reply to nur den Anfang einer Datei einlesen on Thu, 26 May 2011 11:31:32 GMT]]></title><description><![CDATA[<p>hallo,<br />
danke für die Antwort.</p>
<p>anschließend wird ein xml-parser benutzt (altovaxml), wenn ich weiß welches format ich habe.</p>
<p>deshalb dachte ich mir, dass für das einlesen der ersten paar zeichen, bis ich weiß was es ist, ein normaler stream am besten geeignet ist</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2069005</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2069005</guid><dc:creator><![CDATA[C Anfänger]]></dc:creator><pubDate>Thu, 26 May 2011 11:31:32 GMT</pubDate></item><item><title><![CDATA[Reply to nur den Anfang einer Datei einlesen on Thu, 26 May 2011 11:37:20 GMT]]></title><description><![CDATA[<p>hm, hab grad über deine Idee weiterüberlegt.</p>
<p>AltovaXML baut auf Xerces auf, damit habe ich ja einen Parser den ich kurz für die Aufgabe auch hernehmen kann.</p>
<p>Wollte nur um den Parser rum, weil ich Bedenken habe, dass die Klasse das XML komplett einliest, was ja nicht nötig ist.<br />
Aber wenn ein XML-Parser auch nur so weit liest, wie er für den Moment braucht, kommt es aufs gleiche raus</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2069012</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2069012</guid><dc:creator><![CDATA[C Anfänger]]></dc:creator><pubDate>Thu, 26 May 2011 11:37:20 GMT</pubDate></item><item><title><![CDATA[Reply to nur den Anfang einer Datei einlesen on Thu, 26 May 2011 11:43:12 GMT]]></title><description><![CDATA[<p>sorry dass ich grad spamme aber meine Gedanken kommen grad Stück für Stück <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":-)"
      alt="🙂"
    /></p>
<p>Hab nun bei Xerces in die API geschaut und dort steht, dass sie DOM, SAX, und SAX2 anbieten.<br />
Kann mir wer erklären, was diese Funktionen unterscheidet? Wo die Vor- und Nachteile sind!?</p>
<p>Danke</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2069020</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2069020</guid><dc:creator><![CDATA[C Anfänger]]></dc:creator><pubDate>Thu, 26 May 2011 11:43:12 GMT</pubDate></item><item><title><![CDATA[Reply to nur den Anfang einer Datei einlesen on Thu, 26 May 2011 12:11:13 GMT]]></title><description><![CDATA[<p>DOM: <a href="http://en.wikipedia.org/wiki/Document_Object_Model" rel="nofollow">http://en.wikipedia.org/wiki/Document_Object_Model</a><br />
SAX: <a href="http://en.wikipedia.org/wiki/Simple_API_for_XML" rel="nofollow">http://en.wikipedia.org/wiki/Simple_API_for_XML</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2069060</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2069060</guid><dc:creator><![CDATA[theta]]></dc:creator><pubDate>Thu, 26 May 2011 12:11:13 GMT</pubDate></item><item><title><![CDATA[Reply to nur den Anfang einer Datei einlesen on Thu, 26 May 2011 13:38:26 GMT]]></title><description><![CDATA[<p>Kennt sich wer mit Xerces aus?<br />
Komme da nicht weiter, lese seit Stunden rum.</p>
<pre><code class="language-cpp">xercesc::XercesDOMParser* parser = new xercesc::XercesDOMParser();

//damit nicht alles eingelesen wird dachte ich mir, ich lese nur das erste
xercesc::XMLPScanToken token;
parser-&gt;parseFirst(_fileName, token);

//nun will ich den Namen des ersten Elements haben,
//was ja das Wurzelelement sein duerft
//und genau das will ich, mehr brauch ich nicht
</code></pre>
<p>Wie ich an den Namen des Wurzelelements komme check ich nicht. Hab verschiedene Sachen über DOMDocument gemacht, hab geschaut ob ich das über GRammar bekomme...<br />
ich habe das Gefühl, dass ich nur dumm rum probiere und in den Samples und API hab ich bis jetzt auch die Lösung noch nicht gefunden.</p>
<p>Wenn sich wer auskennt und weiß was ich machen muss, fänd ich das toll</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2069142</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2069142</guid><dc:creator><![CDATA[C Anfänger]]></dc:creator><pubDate>Thu, 26 May 2011 13:38:26 GMT</pubDate></item><item><title><![CDATA[Reply to nur den Anfang einer Datei einlesen on Thu, 26 May 2011 14:12:44 GMT]]></title><description><![CDATA[<p>nur mit parser-&gt;parseFirst(_fileName, token); hab ichs nicht hinbekommen.</p>
<p>So komme ich grad auf das Ergebnis:</p>
<pre><code class="language-cpp">xercesc::XercesDOMParser* parser = new xercesc::XercesDOMParser();
parser-&gt;setValidationScheme(xercesc::XercesDOMParser::Val_Always);
parser-&gt;setDoNamespaces(true);    // optional

xercesc::ErrorHandler* errHandler = (xercesc::ErrorHandler*) new xercesc::HandlerBase();
parser-&gt;setErrorHandler(errHandler);

parser-&gt;parse(_fileName);
xercesc::DOMDocument* document = parser-&gt;adoptDocument();
xercesc::DOMNode* firstNode = document-&gt;getFirstChild();
CString rootName = firstNode-&gt;getLocalName();
</code></pre>
<p>So wird aber alles eingelesen, was ich nicht will.<br />
Anstelle von parse(_fileName) kann ich aber auch</p>
<pre><code class="language-cpp">xercesc::XMLPScanToken token;
parser-&gt;parseFirst(_fileName, token);
parser-&gt;parseNext(token);
</code></pre>
<p>machen.</p>
<p>Wie geht es am geschicktesten und schnellsten (schnell auf Performance bezogen)? Hab nicht das Gefühl als wäre das der beste Weg.</p>
<p>Danke</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2069176</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2069176</guid><dc:creator><![CDATA[C Anfänger]]></dc:creator><pubDate>Thu, 26 May 2011 14:12:44 GMT</pubDate></item><item><title><![CDATA[Reply to nur den Anfang einer Datei einlesen on Thu, 26 May 2011 15:34:40 GMT]]></title><description><![CDATA[<p>Nimm einen SAX Parser - ich denke Xerces kann das.<br />
Lies auf Wikipedia oder sonst wo nach warum genau SAX.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2069224</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2069224</guid><dc:creator><![CDATA[theta]]></dc:creator><pubDate>Thu, 26 May 2011 15:34:40 GMT</pubDate></item></channel></rss>