SAXParseException: Element-Typ "CountryNamecode" werden muss, gefolgt von Attribut-Spezifikationen, ">" oder "/>"
OK, das scheint eine häufige Fehlermeldung, aber ich habe diese von ein paar Winkel, und ich bin ratlos.
Meine XML (komplette Datei ist riesig, so dass die Beschränkung auf Gebiet, das scheint im Zusammenhang, es sei denn, jemand kann mir sagen wie/warum, ich brauche mehr hier):
<?xml version="1.0" encoding="utf-8"?>
<MyXML date="201112102200" type="daily">
<CountryList>
<CountryName code="AARCT" name="Antarctica" IsTerritory="True"/>
<CountryName code="ABKHAZ" name="Abkhazia" IsTerritory="True"/>
<!-- ... -->
<CountryName code="VCAN" name="Vatican City" IsTerritory="False" ProfileURL="vatican city.doc"/>
<CountryName code="VEN" name="Venezuela" IsTerritory="False" ProfileURL="venezuela.doc"/>
<CountryName code="VI" name="US Virgin Islands" IsTerritory="True"/>
<CountryName code="VIETN" name="Vietnam" IsTerritory="False" ProfileURL="vietnam.doc"/>
<CountryName code="WALLIS" name="Wallis and Futuna Islands" IsTerritory="True"/>
<CountryName code="WSOMOA" name="Samoa" IsTerritory="False" ProfileURL="samoa.doc"/>
<CountryName code="YEMAR" name="Yemen" IsTerritory="False" ProfileURL="yemen.doc"/>
<CountryName code="YUG" name="Serbia" IsTerritory="False" ProfileURL="serbia.doc"/>
<CountryName code="ZAIRE" name="Democratic Republic of the Congo" IsTerritory="False" ProfileURL="democratic republic of the congo.doc"/>
<CountryName code="ZAMBIA" name="Zambia" IsTerritory="False" ProfileURL="zambia.doc"/>
<CountryName code="ZIMBAB" name="Zimbabwe" IsTerritory="False" ProfileURL="zimbabwe.doc"/>
</CountryList>
<!-- ... -->
</MyXML>
Also der Fehler ist:
org.xml.sax.SAXParseException: Element type "CountryNamecode" must be followed by either attribute specifications, ">" or "/>".
at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(AbstractSAXParser.java:1231)
at com.foo.bar.Baz.<init>(Baz.java:38)
at com.foo.bar.BazTest.testRecordCounts(BazTest.java:69)
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 org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:41)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20)
at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28)
at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:31)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:76)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:193)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:52)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:191)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:42)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:184)
at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28)
at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:31)
at org.junit.runners.ParentRunner.run(ParentRunner.java:236)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)
Der Anmeldung habe ich angegeben, andernfalls nach country-code "VI", und, dass es etwas falsch mit dem "VIETN" - Eintrag.
Also, es scheint nicht zu sein, ein fehlerhaftes element namens "CountryNamecode", ich habe für Zwielichtige Charaktere, aber es ist alles ziemlich Vanille Charakter-klug. Die gesamte Datei überprüft, wenn ich überprüft es, mit STS -, Sauerstoff -, und xmllint.
Jede Hilfe auf diesem würde sehr geschätzt werden.
Cheers folks!
EDIT:
XMLReader xmlReader = XMLReaderFactory.createXMLReader();
xmlReader.setContentHandler(this);
xmlReader.setErrorHandler(this);
xmlReader.parse(new InputSource(new StringReader(retriever.getContent())));
Den retriever-Objekt ist die Rückgabe der xml-string, und anders als das, ich bin in der Analyse einer InputSource, übergeben Sie den StringReader. Es sei denn, es ist etwas, offensichtlich fehlt mir
CountryName
und die code
- Attribut in der xml-Quelle.War etwas mehr versteckt, als, dass, es war die Lesung der string aus der Quell-Datei (wie in der Antwort unten), aber cheers für die Anregung, Sie waren Art-von rechts!
InformationsquelleAutor theZenPebble | 2012-02-27
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich würde sein bereit zu Wetten, dass das Problem in der zugrunde liegenden data stream-code.
Unterstützen meine Theorie, öffnen Sie die original-Datei, bewegen Sie den cursor, um den Raum zwischen
CountryName
undcode
und einen Weg finden, der die Bestimmung der genauen offset, die Leerzeichen in der Datei. Es ist wahrscheinlich ein genaues Vielfaches von 1024 und wahrscheinlich 4096 oder 8192.Dann schauen Sie auf die
InputSource
oderReader
code, den Sie verwenden, um feed der SAX-parser. Es wird wahrscheinlich so Aussehen:Ich vermute, was auch immer Sie verwenden statt der
new InputSource(new StringReader(xml))
ich benutze, ist, was die Beschädigung der Daten.Aus dem edit würde ich vorschlagen, die Untersuchung
retriever.getContent()
um zu sehen, was es tut, zwischen-Puffer.Bullseye, ich war trimmen der string, während ich anfügen. Prost!
InformationsquelleAutor OldCurmudgeon