so I been asking a couple questions here today and with the help of the amazing SO community I've been able to understand the basics of SAX, as well as learn how to properly traverse a directory structure.
Now, with my program, I can access the XML file I am looking for, but I am not sure what this error I am getting means or where I am going wrong within the code for my SAXHandler class. Could someone take a look at this and give me some feedback?
XML FILE
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
- <Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships">
<Relationship Id="rId8" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/footer" Target="footer1.xml" />
<Relationship Id="rId13" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/theme" Target="theme/theme1.xml" />
<Relationship Id="rId3" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/settings" Target="settings.xml" />
<Relationship Id="rId7" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/header" Target="header1.xml" />
<Relationship Id="rId12" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/fontTable" Target="fontTable.xml" />
<Relationship Id="rId2" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/styles" Target="styles.xml" />
<Relationship Id="rId1" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/numbering" Target="numbering.xml" />
<Relationship Id="rId6" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/endnotes" Target="endnotes.xml" />
<Relationship Id="rId11" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/image" Target="media/image3.png" />
<Relationship Id="rId5" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/footnotes" Target="footnotes.xml" />
<Relationship Id="rId10" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/image" Target="media/image2.jpeg" />
<Relationship Id="rId4" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/webSettings" Target="webSettings.xml" />
<Relationship Id="rId9" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/image" Target="media/image1.jpeg" />
</Relationships>
Java Code
import java.io.*;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.xml.sax.*;
import org.xml.sax.helpers.*;
public class XMLParser
{
public static void main(String[] args) throws IOException
{
traverse(new File("C:/Documents and Settings/user/workspace/Intern Project/Proposals/Converted Proposals/Extracted Items"));
}
private static final class SaxHandler extends DefaultHandler
{
// invoked when document-parsing is started:
public void startDocument() throws SAXException
{
System.out.println("Document processing started");
}
// notifies about finish of parsing:
public void endDocument() throws SAXException
{
System.out.println("Document processing finished");
}
// we enter to element 'qName':
public void startElement(String uri, String localName,
String qName, Attributes attrs) throws SAXException
{
if(qName.equalsIgnoreCase("Relationship"))
{
String val = attrs.getValue("Target");
if(val != null)
{
if (val.contains("image"))
{
String id = attrs.getValue("Id");
System.out.println("Id: " + id + "& Target: " + val);
}
}
}
else if(qName.equalsIgnoreCase("Relationships"))
{
//do nothing
}
else
{
throw new IllegalArgumentException("Element '" +
qName + "' is not allowed here");
}
}
// we leave element 'qName' without any actions:
public void endElement(String uri, String localName, String qName)
throws SAXException
{
// do nothing;
}
}
private static void traverse(File directory)
{
//Get all files in directory
File[] files = directory.listFiles();
for (File file : files)
{
if (file.isDirectory())
{
//It's a directory so (recursively) traverse it
traverse(file);
}
else if (file.getName().equals("document.xml.rels"))
{
try
{
System.out.println("5");
// creates and returns new instance of SAX-implementation:
SAXParserFactory factory = SAXParserFactory.newInstance();
// create SAX-parser...
SAXParser parser = factory.newSAXParser();
// .. define our handler:
SaxHandler handler = new SaxHandler();
// and parse:
parser.parse(file.getAbsolutePath(), handler);
}
catch (Exception ex)
{
ex.printStackTrace(System.out);
}
}
}
}
}
Error
5
Document processing started
java.lang.IllegalArgumentException: Element 'Relationships' is not allowed here
at XMLParser$SaxHandler.startElement(XMLParser.java:57)
at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.startElement(Unknown Source)
at com.sun.org.apache.xerces.internal.impl.dtd.XMLDTDValidator.startElement(Unknown Source)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentFra开发者_如何转开发gmentScannerImpl.scanStartElement(Unknown Source)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl$ContentDriver.scanRootElementHook(Unknown Source)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(Unknown Source)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl$PrologDriver.next(Unknown Source)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(Unknown Source)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(Unknown Source)
at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(Unknown Source)
at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(Unknown Source)
at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(Unknown Source)
at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(Unknown Source)
at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(Unknown Source)
at javax.xml.parsers.SAXParser.parse(Unknown Source)
at javax.xml.parsers.SAXParser.parse(Unknown Source)
at XMLParser.traverse(XMLParser.java:96)
at XMLParser.traverse(XMLParser.java:79)
at XMLParser.traverse(XMLParser.java:79)
at XMLParser.traverse(XMLParser.java:79)
at XMLParser.main(XMLParser.java:13)
5
Document processing started
java.lang.IllegalArgumentException: Element 'Relationships' is not allowed here
at XMLParser$SaxHandler.startElement(XMLParser.java:57)
at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.startElement(Unknown Source)
at com.sun.org.apache.xerces.internal.impl.dtd.XMLDTDValidator.startElement(Unknown Source)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanStartElement(Unknown Source)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl$ContentDriver.scanRootElementHook(Unknown Source)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(Unknown Source)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl$PrologDriver.next(Unknown Source)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(Unknown Source)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(Unknown Source)
at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(Unknown Source)
at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(Unknown Source)
at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(Unknown Source)
at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(Unknown Source)
at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(Unknown Source)
at javax.xml.parsers.SAXParser.parse(Unknown Source)
at javax.xml.parsers.SAXParser.parse(Unknown Source)
at XMLParser.traverse(XMLParser.java:96)
at XMLParser.traverse(XMLParser.java:79)
at XMLParser.traverse(XMLParser.java:79)
at XMLParser.traverse(XMLParser.java:79)
at XMLParser.main(XMLParser.java:13)
5
Document processing started
java.lang.IllegalArgumentException: Element 'Relationships' is not allowed here
at XMLParser$SaxHandler.startElement(XMLParser.java:57)
at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.startElement(Unknown Source)
at com.sun.org.apache.xerces.internal.impl.dtd.XMLDTDValidator.startElement(Unknown Source)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanStartElement(Unknown Source)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl$ContentDriver.scanRootElementHook(Unknown Source)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(Unknown Source)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl$PrologDriver.next(Unknown Source)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(Unknown Source)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(Unknown Source)
at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(Unknown Source)
at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(Unknown Source)
at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(Unknown Source)
at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(Unknown Source)
at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(Unknown Source)
at javax.xml.parsers.SAXParser.parse(Unknown Source)
at javax.xml.parsers.SAXParser.parse(Unknown Source)
at XMLParser.traverse(XMLParser.java:96)
at XMLParser.traverse(XMLParser.java:79)
at XMLParser.traverse(XMLParser.java:79)
at XMLParser.traverse(XMLParser.java:79)
at XMLParser.main(XMLParser.java:13)
5
Document processing started
java.lang.IllegalArgumentException: Element 'Relationships' is not allowed here
at XMLParser$SaxHandler.startElement(XMLParser.java:57)
at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.startElement(Unknown Source)
at com.sun.org.apache.xerces.internal.impl.dtd.XMLDTDValidator.startElement(Unknown Source)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanStartElement(Unknown Source)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl$ContentDriver.scanRootElementHook(Unknown Source)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(Unknown Source)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl$PrologDriver.next(Unknown Source)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(Unknown Source)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(Unknown Source)
at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(Unknown Source)
at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(Unknown Source)
at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(Unknown Source)
at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(Unknown Source)
at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(Unknown Source)
at javax.xml.parsers.SAXParser.parse(Unknown Source)
at javax.xml.parsers.SAXParser.parse(Unknown Source)
at XMLParser.traverse(XMLParser.java:96)
at XMLParser.traverse(XMLParser.java:79)
at XMLParser.traverse(XMLParser.java:79)
at XMLParser.traverse(XMLParser.java:79)
at XMLParser.main(XMLParser.java:13)
Working Output Thanks to Jorge M.
Document processing started
Id: rId13& Target: media/image3.jpeg
Id: rId18& Target: media/image8.jpeg
Id: rId26& Target: media/image16.jpeg
Id: rId39& Target: media/image29.jpeg
Id: rId21& Target: media/image11.jpeg
Id: rId34& Target: media/image24.jpeg
Id: rId7& Target: media/image1.jpeg
Id: rId12& Target: media/image2.jpeg
Id: rId17& Target: media/image7.jpeg
Id: rId25& Target: media/image15.jpeg
Id: rId33& Target: media/image23.jpeg
Id: rId38& Target: media/image28.jpeg
Id: rId16& Target: media/image6.jpeg
Id: rId20& Target: media/image10.jpeg
Id: rId29& Target: media/image19.jpeg
Id: rId24& Target: media/image14.jpeg
Id: rId32& Target: media/image22.jpeg
Id: rId37& Target: media/image27.jpeg
Id: rId15& Target: media/image5.jpeg
Id: rId23& Target: media/image13.jpeg
Id: rId28& Target: media/image18.jpeg
Id: rId36& Target: media/image26.jpeg
Id: rId19& Target: media/image9.jpeg
Id: rId31& Target: media/image21.jpeg
Id: rId14& Target: media/image4.jpeg
Id: rId22& Target: media/image12.jpeg
Id: rId27& Target: media/image17.jpeg
Id: rId30& Target: media/image20.jpeg
Id: rId35& Target: media/image25.jpeg
Document processing finished
Document processing started
Id: rId11& Target: media/image2.png
Id: rId9& Target: media/image1.jpeg
Document processing finished
Document processing started
Id: rId11& Target: media/image3.png
Id: rId10& Target: media/image2.jpeg
Id: rId9& Target: media/image1.jpeg
Document processing finished
Document processing started
Id: rId8& Target: media/image2.jpeg
Id: rId13& Target: media/image5.jpeg
Id: rId7& Target: media/image1.jpeg
Id: rId12& Target: media/image4.jpeg
Id: rId17& Target: media/image8.png
Id: rId15& Target: media/image7.jpeg
Id: rId9& Target: media/image3.jpeg
Id: rId14& Target: media/image6.jpeg
Document processing finished
Thank you in advance for any help!
On every start element you check if its equal to "Relationship" but the first Element is "Relationships" so its not equal and you throw an exception. Thats the behavior you implemented so far ;)
Thats the peace of code im referencing to:
public void startElement(String uri, String localName,
String qName, Attributes attrs) throws SAXException
{
if(localName.equalsIgnoreCase("Relationship"))
{
.....
}
else
{
throw new IllegalArgumentException("Element '" +
qName + "' is not allowed here");
}
}
A possible solution(It is definitely not good style but solves the problem which you face)
public void startElement(String uri, String localName,
String qName, Attributes attrs) throws SAXException
{
if(qName.equalsIgnoreCase("Relationship"))
{
.....
}
else if (qName.equalsIgnoreCase("Relationships") {
// do nothing
}
else
{
throw new IllegalArgumentException("Element '" +
qName + "' is not allowed here");
}
}
精彩评论