java.net.MalformedURLException-在通过StAX解析XML文件时

java.net.MalformedURLException-在通过StAX解析XML文件时,java,xml,xml-parsing,runtimeexception,stax,Java,Xml,Xml Parsing,Runtimeexception,Stax,我必须用StAX解析XML文件 我发现了很多例外情况: javax.xml.stream.XMLStreamException: java.net.MalformedURLException at com.sun.org.apache.xerces.internal.impl.XMLStreamReaderImpl.setInputSource(XMLStreamReaderImpl.java:217) at com.sun.org.apache.xerces.internal.

我必须用StAX解析XML文件

我发现了很多例外情况:

javax.xml.stream.XMLStreamException: java.net.MalformedURLException
    at com.sun.org.apache.xerces.internal.impl.XMLStreamReaderImpl.setInputSource(XMLStreamReaderImpl.java:217)
    at com.sun.org.apache.xerces.internal.impl.XMLStreamReaderImpl.<init>(XMLStreamReaderImpl.java:189)
    at com.sun.xml.internal.stream.XMLInputFactoryImpl.getXMLStreamReaderImpl(XMLInputFactoryImpl.java:262)
    at com.sun.xml.internal.stream.XMLInputFactoryImpl.createXMLStreamReader(XMLInputFactoryImpl.java:129)
    at com.epam.lab.StaxXmlParser.<init>(StAXParserDemo.java:46)
    at com.epam.lab.StAXParserDemo.main(StAXParserDemo.java:20)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:120)
Caused by: java.net.MalformedURLException
    at java.net.URL.<init>(URL.java:619)
    at java.net.URL.<init>(URL.java:482)
    at java.net.URL.<init>(URL.java:431)
    at com.sun.org.apache.xerces.internal.impl.XMLEntityManager.setupCurrentEntity(XMLEntityManager.java:610)
    at com.sun.org.apache.xerces.internal.impl.XMLEntityManager.startEntity(XMLEntityManager.java:1290)
    at com.sun.org.apache.xerces.internal.impl.XMLEntityManager.startDocumentEntity(XMLEntityManager.java:1242)
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.setInputSource(XMLDocumentScannerImpl.java:257)
    at com.sun.org.apache.xerces.internal.impl.XMLStreamReaderImpl.setInputSource(XMLStreamReaderImpl.java:204)
属性提取有什么问题?我把问题改得更接近新问题


为什么会发生这种情况?有什么建议吗?

您的问题似乎与
类加载器#getSystemResourceAsStream()
有关。此方法将在类路径中查找资源,如果找不到,您将得到
XMLStreamReader
投诉格式错误

选项:

  • 使用
    FileInputStream
    并提供文件的路径

    reader=factory.createXMLStreamReader(新文件输入流(路径_到_XML))

  • 通过运行方式将xml添加到eclipse
    classpath
    Run-As
    ->
    运行配置
    ->
    类路径
    ->单击
    用户条目
    ,然后单击
    高级
    ->
    添加外部文件夹
    (转到包含xml的文件夹)


  • 非常感谢-我用next完成了它:
    reader=factory.createXMLStreamReader(新文件输入流(新文件名))。现在它打印我是新的Intellij用户。现在它打印-
    Employee{name=Carl Cracker,salary=75000.0,hireDay=null}
    您正在这里打印Employee对象:
    System.out.println(emp)。尝试
    System.out.println(emp.getName());System.out.println(emp.getSalary())etc@PopoFibo我在Employee类上写了
    toString()
    。是的,这很明显,因为它正在打印正确的数据。这不是你需要的格式吗?
    <?xml version="1.0" encoding="UTF-8"?>
    <staff xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xsi:noNamespaceSchemaLocation="newEmployee.xsd">    
        <employee>
            <name>Carl Cracker</name>
            <salary>75000</salary>
            <hiredate year="1987" month="12" day="15" />
        </employee>
        <employee>
            <name>Harry Hacker</name>
            <salary>50000</salary>
            <hiredate year="1989" month="10" day="1" />
        </employee>
        <employee>
            <name>Tony Tester</name>
            <salary>40000</salary>
            <hiredate year="1990" month="3" day="15" />
        </employee>    
    </staff>
    
    public class StAXParserDemo {
        public static void main(String[] args) {
            try {
                StaxXmlParser staxXmlParser = new StaxXmlParser(EMPLOYEE_XML.getFilename());
                List<Employee> employees = staxXmlParser.parseEmployee();
                for (Employee emp : employees) {
                    System.out.println(emp);
                }
            } catch (Throwable e) {
                e.printStackTrace();
            }    
        }
    }
    
    class StaxXmlParser {
    
        private List<Employee> employeeList;
        private Employee currentEmployee;
        private String tagContent;
        private XMLStreamReader reader;
    
        public StaxXmlParser(String filename) {
            employeeList = null;
            currentEmployee = null;
            tagContent = null;
    
            try {
                XMLInputFactory factory = XMLInputFactory.newFactory();
                reader = factory.createXMLStreamReader(ClassLoader.getSystemResourceAsStream(filename));
                parseEmployee();
            } catch (XMLStreamException e) {
                e.printStackTrace();
            }
        }
    
        public List<Employee> parseEmployee() throws XMLStreamException {
            while (reader.hasNext()) {
                int event = reader.next();
    
                switch (event) {
                    case XMLStreamConstants.START_ELEMENT:
                        if ("employee".equals(reader.getLocalName())) {
                            currentEmployee = new Employee();
                        }
                        if ("staff".equals(reader.getLocalName())) {
                            employeeList = new ArrayList<>();
                        }
                        if ("hireday".equals(reader.getLocalName())) {
                            int yearAttr = Integer.parseInt(reader.getAttributeValue(XMLConstants.W3C_XML_SCHEMA_INSTANCE_NS_URI, "year"));
                            int monthAttr = Integer.parseInt(reader.getAttributeValue(XMLConstants.W3C_XML_SCHEMA_INSTANCE_NS_URI, "month"));
                            int dayAttr = Integer.parseInt(reader.getAttributeValue(XMLConstants.W3C_XML_SCHEMA_INSTANCE_NS_URI, "day"));
    
                            currentEmployee.setHireDay(yearAttr, monthAttr, dayAttr);
                        }
                        break;
    
                    case XMLStreamConstants.CHARACTERS:
                        tagContent = reader.getText().trim();
                        break;
    
                    case XMLStreamConstants.END_ELEMENT:
                        switch (reader.getLocalName()) {
                            case "employee":
                                employeeList.add(currentEmployee);
                                break;
                            case "name":
                                currentEmployee.setName(tagContent);
                                break;
                            case "salary":
                                currentEmployee.setSalary(Double.parseDouble(tagContent));
                                break;
                        }
                }
            }
            return employeeList;
        }
    }
    
    Employee { name=Carl Cracker, salary=75000.0, hireDay=null }
    Employee { name=Harry Hacker, salary=50000.0, hireDay=null }
    Employee { name=Tony Tester, salary=40000.0, hireDay=null }