Java 在解组上替换已删除的命名空间详细信息
我的业务需求是从类(在模式中定义)以尽可能轻量级的形式生成XML。为了实现这一点,我从xml中删除了所有名称空间信息 示例架构: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"
<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();