当前位置: 首页 > 面试题库 >

JAXB编组问题-可能与名称空间有关

孙正业
2023-03-14
问题内容

给定初始XML(BPEL)文件:

 <?xml version="1.0" encoding="UTF-8"?>
<process
    name="TestSVG2"
    xmlns="http://www.example.org"
    targetNamespace="http://www.example.org"
    xmlns:xsd="http://www.w3.org/2001/XMLSchema">

    <sequence>
        <receive name="Receive1" createInstance="yes"/>
        <assign name="Assign1"/>
        <invoke name="Invoke1"/>
        <assign name="Assign2"/>
        <reply name="Reply1"/>
    </sequence>
</process>

我编写了一个使用JAXB的函数,以修改XML内的某些数据。功能如下:

public void editAction(String name, String newName) {
    Process proc;
    StringWriter sw = new StringWriter();
    JAXBContext jaxbContext = null;
    Unmarshaller unMarsh = null;
    Object obj = new Object();
    try {
        /* XML TO JAVA OBJECT */
        jaxbContext = JAXBContext.newInstance("org.example");
        unMarsh = jaxbContext.createUnmarshaller();
        obj = unMarsh.unmarshal(new File(path + "/resources/" + BPELFilename));
        proc = (Process) obj;
        Process.Sequence sequence = proc.getSequence();

        /* Determine which element needs to be edited */
       /* Do some editing , code wasn't included */

        /* OBJ Back to XML */
        Marshaller marsh = jaxbContext.createMarshaller();
        marsh.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
        //marsh.setProperty("com.sun.xml.bind.namespacePrefixMapper", new CustomPrefixMapper());
        marsh.marshal(obj, new File(path + "/resources/" + BPELFilename));

    } catch (JAXBException e) {
        /* Be afraid */
        e.printStackTrace();
    }
}

与JAXB相关的编辑之后的结果XML为:

<!-- After -->
 <?xml version="1.0" encoding="UTF-8"?>
<ns0:process 
    name="TestSVG2" 
    targetNamespace="http://www.example.org" 
    xmlns:ns0="http://www.example.org">

    <ns0:sequence>
        <ns0:receive name="newName" createInstance="yes"/>
        <ns0:assign name="Assign1"/>
        <ns0:assign name="Assign2"/>
        <ns0:invoke name="Invoke1"/>
        <ns0:reply name="Reply1"/>
    </ns0:sequence>
</ns0:process>

不幸的是,由于解析新XML时XML解析器崩溃,因此生成的XML不符合我们的应用程序

所以:

  • 如何ns0在生成的XML中删除名称空间?
  • 如何在初始XML文件中保留相同的标头(xml:xsd缺少)?

谢谢!


问题答案:

如果使用MOXy JAXB实现,则可以执行以下操作:

您的域对象:

package example;

import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement
public class Process {

}

使用该包注释@XmlSchema

@javax.xml.bind.annotation.XmlSchema( 
    namespace = "http://www.example.org", 
    xmlns = {
        @javax.xml.bind.annotation.XmlNs(prefix = "xsd", namespaceURI = "http://www.w3.org/2001/XMLSchema"),
    },
    elementFormDefault = javax.xml.bind.annotation.XmlNsForm.QUALIFIED) 
package example;

要使用MOXy JAXB,您需要在模型类中添加jaxb.properties文件,并带有以下条目:

javax.xml.bind.context.factory=org.eclipse.persistence.jaxb.JAXBContextFactory

这将产生XML:

<?xml version="1.0" encoding="UTF-8"?>
<process xmlns="http://www.example.org" xmlns:xsd="http://www.w3.org/2001/XMLSchema"/>


 类似资料:
  • 问题内容: 这是我的xml,需要将其转换为Java。我用过jaxb 并引发以下异常javax.xml.bind.UnmarshalException:意外元素(uri:“ http://www.ae.com/Event/Load ”,本地:“ Order”)。期望的元素是<{} lm:Order> 这是我的解组代码 订购Pojo班 您能否也帮助我阅读,当前正在读取文件,需要读取为XML Strin

  • 在marshall一个JAXB类之后,我有下面的XML: 这个 它可能包含未知数量的具有自己名称空间的其他元素。 问题: 当我马歇尔的一些。类对象,jaxb将另一个的名称空间。类作为ns0导入根元素,因为我得到 这是一个问题,因为 我需要@XmlElementRefs和@XmlElementRef注释,因为我需要从json转换为XML,并且Jackson需要知道“任何”列表可能具有的类型。 我如何

  • 仅当我从 XML 文件内的所有元素中删除“bpmn:”时,此代码才有效,否则它会引发以下异常: javax.xml.bind.UnmarshalException:意外元素(URI:"http://www.omg.org/spec/BPMN/20100524/MODEL",local:"定义") 我试图在不修改XML文件的情况下使其工作。任何帮助将不胜感激。提前致谢 :)

  • 我有情况, 有一个sample.xsd(旧版本-没有命名空间)。为同一个XSD文件使用XJC生成JAXB类。我得到了一个使用JAXB类基于XSD解封XML数据文件的示例。sample.xsd文件已更改(新版本-添加的命名空间)。再次为新的XSD文件使用XJC生成JAXB类。该示例已更新,现在可以用于新的XSD文件 现在我有一个情况,我正在获取基于旧XSD的XML数据文件,我想使用更新的示例文件来解

  • 问题内容: 除了包级别注释外,还有其他方法可以使用注释来控制自定义名称空间前缀。 可以在元素级别完成吗?也可能有一个带有多个前缀的名称空间吗? 问题答案: 您实际上想做什么?为什么名称空间前缀对您很重要? 对于命名空间前缀,没有标准的元素级注释。 我知道的控制名称空间前缀的选项是: 你已经提到过。 提供习俗。 XML的低级处理(例如,在StAX,SAX或DOM级别)。 我也可以想象: / 通常使用

  • 例如,一个XML属性值是,但名称空间前缀“repository”从未在数据集中定义。(不要紧,提供商的最佳实践建议定义它!) 所以当我去解封一个示例集时,具有指定前缀的QName属性(在我上面的示例中为“Repository”)是空的!所以看起来JAXB正在“抛出”那些具有未定义名称空间前缀的属性QName值。我很惊讶,它甚至没有保留当地的名字。 理想情况下,我希望保持该值原样,但看起来我无法在绑