Java 在解组上替换已删除的命名空间详细信息

Java 在解组上替换已删除的命名空间详细信息,java,xml,jaxb,unmarshalling,Java,Xml,Jaxb,Unmarshalling,我的业务需求是从类(在模式中定义)以尽可能轻量级的形式生成XML。为了实现这一点,我从xml中删除了所有名称空间信息 示例架构: <xs:schema xmlns="http://aschema/" xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="http://aschema/" elementFormDefault="qualified"

我的业务需求是从类(在模式中定义)以尽可能轻量级的形式生成XML。为了实现这一点,我从xml中删除了所有名称空间信息

示例架构:

<xs:schema xmlns="http://aschema/" 
           xmlns:xs="http://www.w3.org/2001/XMLSchema" 
           targetNamespace="http://aschema/" 
           elementFormDefault="qualified" 
           attributeFormDefault="unqualified">

  <xs:element name="Test" type="TestType"/>
  <xs:complexType name="TestType">
    <xs:sequence>
      <xs:element name="test" type="xs:string"/>
    </xs:sequence>
  </xs:complexType>
</xs:schema>
主持(如果您愿意,我可以解释如何进行,但我认为这会把问题弄得一团糟-如果有要求,我很乐意补充):

你好,世界!
现在我想解开它。我得到(毫不奇怪):

javax.xml.bind.UnmarshaleException:意外元素(uri:,local:“Test”)。预期的要素是
是否有某种方法可以定义我的解组过程在遇到此问题时使用什么

我无法更改模式-这是一个行业标准

我无法更改
Test
对象-它是从模式生成的

我能找到的对这个错误的所有引用似乎都指向java类中的更改或模式的更改——我不能做这两件事


请注意,我的测试类试图创建一个。我想要解组的真实对象要复杂得多。

像往常一样——一旦我发布了问题,一个解决方案出现了——就像变魔术一样。那是你的


@布莱斯·杜汉-我向布莱斯道歉-在我的研究过程中,我遇到了你这么多的工作,这些工作都非常有帮助。根据建议,当之无愧地投上一票。:)可能重复的
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "TestType", propOrder = {
    "test"
})
@XmlRootElement(name = "Test")
public class Test {

    @XmlElement(required = true)
    protected String test;

    /**
     * Gets the value of the test property.
     * 
     * @return
     *     possible object is
     *     {@link String }
     *     
     */
    public String getTest() {
        return test;
    }

    /**
     * Sets the value of the test property.
     * 
     * @param value
     *     allowed object is
     *     {@link String }
     *     
     */
    public void setTest(String value) {
        this.test = value;
    }

}
<Test><test>Hello World!</test></Test>
javax.xml.bind.UnmarshalException: unexpected element (uri:"", local:"Test"). Expected elements are <{http://aschema/}Test>
public class NamespaceFilter extends XMLFilterImpl {

  private static final String NAMESPACE = "http://aschema/";

  @Override
  public void endElement(String uri, String localName, String qName) throws SAXException {
    super.endElement(NAMESPACE, localName, qName);
  }

  @Override
  public void startElement(String uri, String localName, String qName, Attributes atts) throws SAXException {
    super.startElement(NAMESPACE, localName, qName, atts);
  }

}

...

  // Create the XMLFilter
  XMLFilter filter = new NamespaceFilter();

  // Set the parent XMLReader on the XMLFilter
  SAXParserFactory spf = SAXParserFactory.newInstance();
  SAXParser sp = spf.newSAXParser();
  XMLReader xr = sp.getXMLReader();
  filter.setParent(xr);

  // Set UnmarshallerHandler as ContentHandler on XMLFilter
  Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
  UnmarshallerHandler unmarshallerHandler = unmarshaller.getUnmarshallerHandler();
  filter.setContentHandler(unmarshallerHandler);

  // Parse the XML
  filter.parse(new InputSource(r));
  //Object result = unmarshallerHandler.getResult();  
  T t = (T) unmarshallerHandler.getResult();