Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Empfohlene Antworten

Veröffentlicht

Hallo zusammen,

habe ein kleines Problem und zwar sollen XML Dateien eingelesen werden, zurzeit wird dies mit Castor erledigt, wenn in einer XML Datei aber HTML Tags enthalten sind funktioniert dies nicht. Das in Java enthaltene SAX scheint dies zwar zu können aber es dauert ewig bis die Datei geparst wurde.

Nun suche ich eine Alternative dazu, welche schnell arbeitet und mir XML Dateien mit HTML-Tags als Inhalt parst.

Jemand ne Ahnung was ich da am besten nutzen kann?

LG Der_Lampe

hi,

schau dir mal den Link an. Vielleicht hilft der dir weiter. :)

@Sporticus: ich werd mal reinschauen danke schonmal

@Flashpixx: Es wäre möglich auch XHTML zu verwenden, ist es dann den auch noch möglich normale XML Dateien wie auch XHTML Dateien einzulesen? Wenn ja wie?

Wenn ich also z.B. solch eine XHTML Datei habe und diese parsen will...

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"

  "http://www.w3.org/TR/2000/REC-xhtml1-20000126/DTD/xhtml1-strict.dtd">

<Auftrag Nummer="1" Basissprache="2" Zielsprache="3" Erledigt="JJJJ">

  <Begriff Nummer="1" MaximaleLaenge="1">

    <Basis><br />

    <p>fetter Text mit nur einem 

    <strong>fetten</strong> Wort</p>

    <em>kursiv</em> und 

    <u>unterstrichen</u> und 

    <strike>durchgestrichen</strike>

    <p>normale Schrift</p>

    <h1>Überschrift 1</h1>

    <h2>Überschrift 2</h2>

    <p>normale Schrift</p>

    <hr />

    <ul>

      <li>Bulletpoint 1</li>

      <li>Bulletpoint 2</li>

    </ul>

    </Basis>

  </Begriff>

</Auftrag>

läuft dies mit meinem Castor total schief weil der die HTML/XHTML Tags als XML Tags interpretiert :(

läuft dies mit meinem Castor total schief weil der die HTML/XHTML Tags als XML Tags interpretiert :(

Also wenn Du versuchst die Code als HTML und als XML zu verarbeiten, dann wird das in diese Form fehlschlagen, denn es ist kein HTML und ein XML entsprechend der Spezifikation, die Du via DTD angibst ist es auch nicht.

also ich habe das ganze so vor, dass am Ende in einer Klasse ein Objekt "Basis" existiert dass den Inhalt

<br />

    <p>fetter Text mit nur einem 

    <strong>fetten</strong> Wort</p>

    <em>kursiv</em> und 

    <u>unterstrichen</u> und 

    <strike>durchgestrichen</strike>

    <p>normale Schrift</p>

    <h1>Überschrift 1</h1>

    <h2>Überschrift 2</h2>

    <p>normale Schrift</p>

    <hr />

    <ul>

      <li>Bulletpoint 1</li>

      <li>Bulletpoint 2</li>

    </ul>

hat...so die Theorie...ist das überhaupt so möglich?

Möglich ist das schon. Aber Du musst eben entweder die Spezifikation von XML Strict einhalten und eben kein halbes HTML Dokument verarbeiten, dann ist es normal, dass der Parser eben Fehler produziert. Oder Du definierst Dir Dein eigenes Format (ich würde zu einem XML Schema raten) und transformierst es z.B. via XSLT in das gewünschte Ausgabeformat.

Also, ich habe folgende XSD Datei:

<?xml version="1.0" encoding="UTF-8"?>

<!--W3C Schema generated by XML Spy v4.1 U (http://www.xmlspy.com)-->

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">

	<xs:element name="Auftrag">

		<xs:complexType>

			<xs:sequence>

				<xs:element name="Begriff" type="BegriffType" maxOccurs="unbounded"/>

			</xs:sequence>

			<xs:attribute name="Nummer" type="xs:string" use="required"/>

			<xs:attribute name="Basissprache" type="xs:string" use="required"/>

			<xs:attribute name="Zielsprache" type="xs:string" use="required"/>

			<xs:attribute name="Zieltermin" type="xs:string" use="required"/>

			<xs:attribute name="BeschreibungUebersetzen" use="required">

				<xs:simpleType>

					<xs:restriction base="xs:NMTOKEN">

						<xs:enumeration value="0"/>

						<xs:enumeration value="1"/>

					</xs:restriction>

				</xs:simpleType>

			</xs:attribute>

			<xs:attribute name="Erledigt" use="required">

				<xs:simpleType>

					<xs:restriction base="xs:NMTOKEN">

						<xs:enumeration value="JJJJ"/>

						<xs:enumeration value="NNNN"/>

					</xs:restriction>

				</xs:simpleType>

			</xs:attribute>

		</xs:complexType>

	</xs:element>

	<xs:element name="Basis" type="xs:string"/>

	<xs:element name="BasisBeschreibung" type="xs:string"/>

	<xs:complexType name="BegriffType">

		<xs:sequence>

			<xs:element ref="Basis"/>

			<xs:element ref="BasisBeschreibung"/>

			<xs:element ref="Uebersetzung"/>

			<xs:element ref="UebersetzungBeschreibung"/>

		</xs:sequence>

		<xs:attribute name="Nummer" type="xs:string" use="required"/>

		<xs:attribute name="MaximaleLaenge" type="xs:string" use="required"/>

	</xs:complexType>

	<xs:element name="Uebersetzung" type="xs:string"/>

	<xs:element name="UebersetzungBeschreibung" type="xs:string"/>

</xs:schema>
um meine XML-Datei einzulesen:
<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"

  "http://www.w3.org/TR/2000/REC-xhtml1-20000126/DTD/xhtml1-strict.dtd">

<Auftrag Nummer="1" Basissprache="2" Zielsprache="3" Zieltermin="4" BeschreibungUebersetzen="0" Erledigt="JJJJ">

  <Begriff Nummer="1" MaximaleLaenge="1">

    <Basis><br />

    <p>fetter Text mit nur einem 

    <strong>fetten</strong> Wort und noch ein Text mit fett m

    <strong>itt</strong>en im Wort</p>

    <p>das gleiche mit 

    <em>kursiv</em> und 

    <u>unterstrichen</u> und 

    <strike>durchgestrichen</strike> / ku

    <em>rs</em>iv, un-te

    <u>rstr</u>ichen und durc

    <strike>hge</strike>strichen mitten im Wort</p>

    <p>normale Schrift</p>

    <h1>Überschrift 1</h1>

    <h2>Überschrift 2</h2>

    <p>normale Schrift</p>

    <p>und noch 

    <span style="color: rgb(255, 0, 0);">farbig</span> und farbig

    mitten im W

    <span sty-le="color: rgb(0, 255, 0);">o</span>rt</p>

    <p>Linie</p>

    <hr />

    <ol>

      <li>Aufzählung 1</li>

      <li>Aufzählung 2</li>

      <li>Aufzählung 3</li>

    </ol>

    <ul>

      <li>Bulletpoint 1</li>

      <li>Bulletpoint 2</li>

      <li>Bulletpoint 3</li>

    </ul>

    </Basis>

    <BasisBeschreibung></BasisBeschreibung>

    <Uebersetzung></Uebersetzung>

    <UebersetzungBeschreibung></UebersetzungBeschreibung>

  </Begriff>

</Auftrag>

mit welchem Parser kann ich dies jetzt ordnungsgemäß parsen?

Wenn Du jetzt nur die Daten aus der XML anhand des Schemas verarbeiten willst, würde ich zu Jax greifen und via Mashalling die Daten aus der Klasse parsen. Jax kann anhand der Schemadatei Java Klassen erstellen, die Du direkt verwenden kannst. Ansonsten kannst Du eben mit jedem XML Parser nun Deine Datenstruktur auch händisch verarbeiten

also ich habe das eben mal mit XPath ausprobiert und der verschluckt mir sämtliche XHTML Tags :(

ich probiers mal mit Jax, Rückmeldung geb ich auf jeden Fall ;)

Auf jeden Fall schonmal vielen Dank für deine Hilfe :D

OK, funktioniert prima :D

muss jetzt nur noch fix die Geschichte mit dem XSD einbauen aber das dürfte ich allein hinbekommen, vielen Dank flashpixx!!

OK, jetzt hab ich wieder nen Problem und finde keine Lösung,

habe per xjc Klassen für meine XML Datei erstellt, und wenn ich jetzt versuche eine XML Datei(die aus der ich die XSD Datei erstellt habe) zu parsen bekomme ich folgende Fehlermeldung: (egal was unter Basis steht, auch bei keinem Inhalt oder nur mit einem Wort) :(

javax.xml.bind.UnmarshalException

 - with linked exception:

[org.xml.sax.SAXParseException: cvc-type.3.1.2: Element 'Basis' is a simple type, so it must have no element information item [children].]

	at javax.xml.bind.helpers.AbstractUnmarshallerImpl.createUnmarshalException(AbstractUnmarshallerImpl.java:315)

	at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallerImpl.createUnmarshalException(UnmarshallerImpl.java:503)

	at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal0(UnmarshallerImpl.java:204)

	at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal(UnmarshallerImpl.java:173)

	at javax.xml.bind.helpers.AbstractUnmarshallerImpl.unmarshal(AbstractUnmarshallerImpl.java:137)

	at javax.xml.bind.helpers.AbstractUnmarshallerImpl.unmarshal(AbstractUnmarshallerImpl.java:142)

	at javax.xml.bind.helpers.AbstractUnmarshallerImpl.unmarshal(AbstractUnmarshallerImpl.java:151)

	at javax.xml.bind.helpers.AbstractUnmarshallerImpl.unmarshal(AbstractUnmarshallerImpl.java:169)

	at JAXBTest.RoomMarshallerXSD.main(RoomMarshallerXSD.java:37)

	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)

	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)

	at java.lang.reflect.Method.invoke(Method.java:597)

	at com.intellij.rt.execution.application.AppMain.main(AppMain.java:90)

Caused by: org.xml.sax.SAXParseException: cvc-type.3.1.2: Element 'Basis' is a simple type, so it must have no element information item [children].

	at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.createSAXParseException(ErrorHandlerWrapper.java:195)

	at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.error(ErrorHandlerWrapper.java:131)

	at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:384)

	at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:318)

	at com.sun.org.apache.xerces.internal.impl.xs.XMLSchemaValidator$XSIErrorReporter.reportError(XMLSchemaValidator.java:417)

	at com.sun.org.apache.xerces.internal.impl.xs.XMLSchemaValidator.reportSchemaError(XMLSchemaValidator.java:3182)

	at com.sun.org.apache.xerces.internal.impl.xs.XMLSchemaValidator.elementLocallyValidType(XMLSchemaValidator.java:3087)

	at com.sun.org.apache.xerces.internal.impl.xs.XMLSchemaValidator.processElementContent(XMLSchemaValidator.java:3007)

	at com.sun.org.apache.xerces.internal.impl.xs.XMLSchemaValidator.handleEndElement(XMLSchemaValidator.java:2150)

	at com.sun.org.apache.xerces.internal.impl.xs.XMLSchemaValidator.endElement(XMLSchemaValidator.java:818)

	at com.sun.org.apache.xerces.internal.jaxp.validation.ValidatorHandlerImpl.endElement(ValidatorHandlerImpl.java:563)

	at com.sun.xml.internal.bind.v2.runtime.unmarshaller.ValidatingUnmarshaller.endElement(ValidatingUnmarshaller.java:83)

	at com.sun.xml.internal.bind.v2.runtime.unmarshaller.SAXConnector.endElement(SAXConnector.java:145)

	at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.endElement(AbstractSAXParser.java:601)

	at com.sun.org.apache.xerces.internal.impl.dtd.XMLNSDTDValidator.endNamespaceScope(XMLNSDTDValidator.java:263)

	at com.sun.org.apache.xerces.internal.impl.dtd.XMLDTDValidator.handleEndElement(XMLDTDValidator.java:2028)

	at com.sun.org.apache.xerces.internal.impl.dtd.XMLDTDValidator.endElement(XMLDTDValidator.java:901)

	at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanEndElement(XMLDocumentFragmentScannerImpl.java:1782)

	at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(XMLDocumentFragmentScannerImpl.java:2938)

	at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.java:648)

	at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.next(XMLNSDocumentScannerImpl.java:140)

	at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:511)

	at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:808)

	at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:737)

	at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:119)

	at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(AbstractSAXParser.java:1205)

	at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(SAXParserImpl.java:522)

	at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal0(UnmarshallerImpl.java:200)

	... 11 more

halt, mein Fehler...das geschieht nur wenn in Basis XHTML Tags enthalten sind :(

wenn ich die spitzen klammern als < bzw. > schreibe funktioniert das ganze wie gewollt, ist aber leider nicht zweckmäßig...

Bearbeitet von Der_Lampe

also so?

<xs:element name="Basis" >

	  <xs:complexType>

        <xs:any minOccurs="0" maxOccurs="unbounded"/>

    </xs:complexType>

  </xs:element>

kenne mich leider mit XML nicht wirklich gut aus und mit XSD noch weniger :(

wenn ich aus der Schema Datei nun versuche Klassen zu generieren bekomme ich folgende Fehlermeldungen: :(

parsing a schema...

[ERROR] s4s-att-not-allowed: Attribute 'mixed' cannot appear in element 'element'.

  line 32 of file:/.../schema.xsd


[ERROR] s4s-elt-invalid-content.1: The content of '#AnonType_Basis' is invalid.  Element 'any' is in

valid, misplaced, or occurs too often.

  line 34 of file:/.../schema.xsd


Failed to parse a schema.

parsing a schema...

[ERROR] s4s-att-not-allowed: Attribute 'mixed' cannot appear in element 'element'.

  line 32 of file:/.../schema.xsd
diese hier bekomme ich auch einfach weg, wenn ich das "mixed" rauslösche aber die andere verstehe ich nicht:

[ERROR] s4s-elt-invalid-content.1: The content of '#AnonType_Basis' is invalid.  Element 'any' is in

valid, misplaced, or occurs too often.

  line 34 of file:/.../schema.xsd

Erstelle ein Konto oder melde dich an, um einen Kommentar zu schreiben.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.