给定初始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: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值。我很惊讶,它甚至没有保留当地的名字。 理想情况下,我希望保持该值原样,但看起来我无法在绑