Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在未映射的元素上生成JAXB错误_Java_Xml_Jaxb - Fatal编程技术网

Java 在未映射的元素上生成JAXB错误

Java 在未映射的元素上生成JAXB错误,java,xml,jaxb,Java,Xml,Jaxb,我试图做与此相反的事情: 也就是说,我试图用JAXB将XML解析为POJO,我希望JAXB失败,如果它没有找到给定元素的匹配Java属性。我知道我可能可以进行模式验证,但我不希望这样做 例如: @XmlRootElement(name="Dog") public class Dog { private String name; public String getName() {return name;} public String setName(String name)

我试图做与此相反的事情:

也就是说,我试图用JAXB将XML解析为POJO,我希望JAXB失败,如果它没有找到给定元素的匹配Java属性。我知道我可能可以进行模式验证,但我不希望这样做

例如:

@XmlRootElement(name="Dog")
public class Dog {
    private String name;
    public String getName() {return name;}
    public String setName(String name) {this.name = name};
}
此XML将失败:

<Dog>
<id>blah</id>
<name>Stuff</name>
</Dog>

废话
东西

因为没有
id
Java属性

,所以我能够验证缺少的Java属性(w/o模式)的唯一方法是将XML解组到我的POJO,然后使用相同的POJO将其重新组到XML并进行比较

下面是一个使用XMLUnit的示例,它有助于忽略顺序和空白问题

@Test
public void testSerialization() throws Exception {
    XMLUnit.setIgnoreWhitespace(true);

    EventSearchResults r = 
            JAXB.unmarshal(getClass().getResourceAsStream("/EventSearchResults.xml"), 
                    EventSearchResults.class);
    StringWriter sw = new StringWriter();
    JAXB.marshal(r, sw);
    String expected = 
            IOUtils.toString(getClass().getResourceAsStream("/EventSearchResults.xml"), "UTF-8");
    String actual = sw.toString();
    //System.out.println(expected);
    System.out.println(actual);
    assertXMLEqual(expected, actual);
}

这并不理想,但在大多数情况下都适用于单元测试。

您可以利用
验证venthandler
来获得所需的行为。意外元素被视为警告,默认情况下将忽略该警告。为了支持您的用例,您可以提供一个在出现警告时失败的
ValdidationEventHandler
(见下文)

演示

package forum10721257;

import java.io.File;
import javax.xml.bind.*;

public class Demo {

    public static void main(String[] args) throws Exception {
        JAXBContext jc = JAXBContext.newInstance(Dog.class);

        File xml = new File("src/forum10721257/input.xml");
        Unmarshaller unmarshaller = jc.createUnmarshaller();
        unmarshaller.setEventHandler(new ValidationEventHandler () {

            @Override
            public boolean handleEvent(ValidationEvent event) {
                return false;
            }

        });
        Dog dog = (Dog) unmarshaller.unmarshal(xml);
    }

}
JAXB RI异常

Exception in thread "main" javax.xml.bind.UnmarshalException: unexpected element (uri:"", local:"id"). Expected elements are <{}name>
    at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallingContext.handleEvent(UnmarshallingContext.java:647)
    at com.sun.xml.internal.bind.v2.runtime.unmarshaller.Loader.reportError(Loader.java:243)
    at com.sun.xml.internal.bind.v2.runtime.unmarshaller.Loader.reportError(Loader.java:238)
    at com.sun.xml.internal.bind.v2.runtime.unmarshaller.Loader.reportUnexpectedChildElement(Loader.java:105)
    at com.sun.xml.internal.bind.v2.runtime.unmarshaller.Loader.childElement(Loader.java:90)
    at com.sun.xml.internal.bind.v2.runtime.unmarshaller.StructureLoader.childElement(StructureLoader.java:236)
    at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallingContext._startElement(UnmarshallingContext.java:483)
    at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallingContext.startElement(UnmarshallingContext.java:465)
    at com.sun.xml.internal.bind.v2.runtime.unmarshaller.SAXConnector.startElement(SAXConnector.java:135)
    at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.startElement(AbstractSAXParser.java:506)
    at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.scanStartElement(XMLNSDocumentScannerImpl.java:376)
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(XMLDocumentFragmentScannerImpl.java:2715)
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.java:607)
    at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.next(XMLNSDocumentScannerImpl.java:116)
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:488)
    at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:835)
    at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:764)
    at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:123)
    at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(AbstractSAXParser.java:1210)
    at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(SAXParserImpl.java:568)
    at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal0(UnmarshallerImpl.java:202)
    at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal(UnmarshallerImpl.java:174)
    at javax.xml.bind.helpers.AbstractUnmarshallerImpl.unmarshal(AbstractUnmarshallerImpl.java:157)
    at javax.xml.bind.helpers.AbstractUnmarshallerImpl.unmarshal(AbstractUnmarshallerImpl.java:162)
    at javax.xml.bind.helpers.AbstractUnmarshallerImpl.unmarshal(AbstractUnmarshallerImpl.java:171)
    at javax.xml.bind.helpers.AbstractUnmarshallerImpl.unmarshal(AbstractUnmarshallerImpl.java:189)
    at forum10721257.Demo.main(Demo.java:26)

我不知道您是否可以使用jaxb实现这一点。然而,这是XStream的默认行为。它更多地用于单元测试目的。我可能只需要使用XmlUnit,解组XML,然后重新组分并比较我过去所做的工作。嗯,我试过了,但没有成功(假设它不是MOXy)。我得再试一次。顺便说一句,我刚刚用你的技巧处理动态XML元素:。当涉及JAXB时,您可以随意使用:)我在JDK1.7.0(用于Mac)中运行了这段代码,以获得我发布的异常。您使用的是哪个版本的JDK?JDK1.6我将很快再试一次。我想这是因为我创造环境的方式。
package forum10721257;

import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement(name="Dog")
public class Dog {
    private String name;
    public String getName() {return name;}
    public void setName(String name) {this.name = name;}
}