JAXB删除尾随空格,或提示无效文档

时间:2014-08-28 13:07:41

标签: xml jaxb xsd

所以我有一些JAXB注释类,以及一个代表这个类的xml。当我将xml doc解组到类时,一切正常,问题是,我有一些空格,我希望JAXB要么删除它们,要么提示我文档错误,根据我设置的模式unmarshaller,到目前为止我试过了:

  1. 使用限制创建自定义类型:“xs:pattern value =”\ S。+ \ S“
  2. 使用“xs:normalizedString”作为类型
  3. 在自定义类型
  4. 中使用“xs:whiteSpace value =”collapse“”

    以上都不奏效。知道为什么吗?这是预期的行为吗?

    注意:我不想使用@XmlJavaTypeAdapter(MyAwesomeAdapter.class)。

    修改

    我意识到最初的问题是关于解组,下面的代码是关于编组的,但它们是互补的过程,非常相似。

    课程:

    @XmlRootElement(name = "person")
    @XmlAccessorType(XmlAccessType.FIELD)
    public class Person {
    
    @XmlElement
    private String name;
    
    public Person() {
    
    }
    
    public String getName() {
        return name;
    }
    
    public void setName(String name) {
        this.name = name;
    }
    
    private static final class MyValidationEventHandler implements ValidationEventHandler {
    
        @Override
        public boolean handleEvent(ValidationEvent event) {
            System.out.println(event.getMessage());
            return true;
        }
    }
    
    public static void main(String[] args) throws JAXBException, SAXException {
        JAXBContext context = JAXBContext.newInstance(Person.class);
        Marshaller marshaller = context.createMarshaller();
    
        SchemaFactory sf = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
        Schema schema = sf.newSchema(new File("src/person.xsd"));
        marshaller.setSchema(schema);
    
        marshaller.setEventHandler(new MyValidationEventHandler());
    
        Person person = new Person();
        person.setName("Name ");
        marshaller.marshal(person, System.out);
    }
    

    }

    架构:

    <xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
          <xs:element name="person">
            <xs:complexType>
              <xs:sequence>
                <xs:element type="xs:normalizedString" name="name"/>
              </xs:sequence>
            </xs:complexType>
          </xs:element>
    </xs:schema>
    

    输出:

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?><person><name>Name </name></person>
    

    如您所见,没有验证错误,输出包含空格。

    接受答复后编辑 看起来这种模式可以正常工作。

        <xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">   
        <xs:simpleType name="NameType">
            <xs:restriction base='xs:string'>
              <xs:pattern value='\S.*\S'/>
            </xs:restriction>
        </xs:simpleType>
    
        <xs:element name="person">
          <xs:complexType>
            <xs:sequence>
              <xs:element name="name" type="NameType"/>
            </xs:sequence>
          </xs:complexType>
        </xs:element>
    </xs:schema>
    

2 个答案:

答案 0 :(得分:1)

从XML Schema开始

架构类型应设置为xs:token。这将导致使用XmlAdapter(CollapsedStringAdapter.class)生成相应的属性。

从Java类开始

  

我想要的是使用我自己的JAXB注释类,不需要JAXB   为我生成它们。

您可以利用您自己的属性上的现有CollapsedStringAdapter两个在解组期间剥离的空格。

@XmlAdapter(CollapsedStringAdapter.class)
public String getYourProperty() {
    return yourProperty;
}
  

我希望我在unmarshaller中设置的xsd架构会   帮助JAXB修剪,或强制执行normalizedString或whiteSpace   约束

如果您在Schema上指定Unmarshaller,我希望在解组期间发生验证事件。您可以尝试在ValidationEventHandler上注册Unmarshaller以查看是否有任何内容被抛出?它可能以足够低的严重程度发生,不会阻止解组。

答案 1 :(得分:0)

这适用于我,使用jdk1.8.0_20。

对于验证,您可以使用包含构面的XML架构:

<xs:element  name="name">
  <xs:simpleType>
    <xs:restriction base='xs:normalizedString'>
      <xs:pattern value='\S.*\S'/>
    </xs:restriction>
  </xs:simpleType>
</xs:element>

您可以设置处理程序(如代码中所示)或捕获将引发的异常:

event: [severity=FATAL_ERROR,message=cvc-type.3.1.3: The value 'Name  ' of 
element 'name' is not valid.,locator=[url=null,line=-1,column=-1,node=null,
object=generated.Person@7cca494b,field=null]]

它适用于编组和解组。