当前位置: 首页 > 知识库问答 >
问题:

取消封送时替换已删除的命名空间详细信息

连昊天
2023-03-14

我有一个业务需求,以尽可能轻量级的形式从类(定义在模式中)生成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>

生成测试类:

@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>

我不能更改模式--它是一个行业标准。

我无法更改test对象-它是从架构生成的。

我能找到的所有对这个错误的引用似乎要么指向java类的更改,要么指向模式的更改--这两件事我都做不到。

注意,我的测试类是试图创建一个最小的、完整的、经过测试的、可读的示例。我想要解组的真实对象要复杂得多。

共有1个答案

谢英光
2023-03-14

像往常一样--一旦我把问题贴出来,就会有一个解决方案--就像是用魔法一样。这是为你准备的StackOverflow。

从JAXB中使用声明类型的反封送不会用数据填充结果对象

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();
 类似资料:
  • XML信封命名空间的正确URI是什么。我见过很多,例如。”http://www.w3.org/2001/12/soap-envelope“,”http://www.w3.org/2001/06/soap-envelope“,”http://www.w3.org/2003/05/soap-envelope“,”http://schemas.xmlsoap.org/soap/envelope/“。请告

  • 2)如果我按照下面的方式编辑package-info,那么它是很好的,但是问题是我创建的是一个JAXB整数元素如下所示,前缀删除没有应用于这些元素

  • 我有从一个模式创建的JAXB对象。在封送过程中,使用NS2对xml元素进行注释。对于这个问题,我已经尝试了网络上存在的所有选项,但没有一个可行。我不能修改我的模式或更改package-info.java。请帮忙

  • 问题内容: 我喜欢ElementTree解析xml的方式,特别是Xpath功能。我从带有嵌套标签的应用程序以xml输出。 我想按名称访问此标签,而不指定名称空间,这可能吗?例如: 代替: 问题答案: 至少使用lxml2,可以稍微减少此开销:

  • 本文向大家介绍详细解读php的命名空间(一),包括了详细解读php的命名空间(一)的使用技巧和注意事项,需要的朋友参考一下 php的命名空间功能已经出来很久了,但是一直以来没怎么深究过,这次赶着有时间所以特意翻着手册做一个整理和总结帮助自己完善完善,原本准备一篇写完,但发现内容其实还是蛮多的,放一起太长看着累,所以分两篇博客要好些。 一:命名空间概念:命名空间是一种封装事物的方法,类似于目录和文件

  • 本文向大家介绍PHP中的命名空间详细介绍,包括了PHP中的命名空间详细介绍的使用技巧和注意事项,需要的朋友参考一下 概述 PHP对于命名空间的支持,经历了一段艰难的旅程。幸运的是,PHP从5.3开始引入了命名空间。自从PHP引入了命名空间,PHP代码的适用结构也得到了大大的改善。许多编程语言早就有了命名空间的概念,相对于其他语言来说,PHP对于命名空间的支持,稍微有点晚了。不管如何,每一种新特性的