使用自定义名称空间在Java中创建XML字符串

问题描述

我想以编程方式在Java中生成xml字符串,其名称空间是自定义的,如下所示 并且所有数据都必须动态添加到xml中。如何实现这样的功能

<faxml xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="test.xsd">
<person>
  <name>ABC</name>
</person>
</faxml>

我已经看过像这样的示例https://howtodoinjava.com/jaxb/write-object-to-xml/,但是在这里,当xml生成其起始行是

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>

但我希望将示例代码中提到的开始和结束标记<faxml>名称空间作为输出

解决方法

这是一种方法:

首先,这是我的类,表示所需的XML数据:

package org.ajames.jaxb.persons;

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlType;

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "")
@XmlRootElement(name = "faxml")
public class Faxml {
    
    private Person person;
    
    public static class Person {
        
        private String name;

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }
        
    }

    public Person getPerson() {
        return person;
    }

    public void setPerson(Person person) {
        this.person = person;
    }
    
}

我选择将Person类嵌套在根类中-仅用于此测试。当然,还有其他方法可以安排这些类,因此它们不会嵌套。

然后我将package-info的{​​{1}}定义如下:

org.ajames.jaxb.persons

要将数据从Java对象处理为XML,我使用以下测试数据:

@XmlSchema(
        namespace = "",elementFormDefault = XmlNsForm.UNSET,xmlns = {
            @XmlNs(prefix = "",namespaceURI = "http://www.w3.org/2001/XMLSchema-instance")
        })
package org.ajames.jaxb.persons;

import javax.xml.bind.annotation.XmlSchema;
import javax.xml.bind.annotation.XmlNs;
import javax.xml.bind.annotation.XmlNsForm;

对于此测试,假设我们将XML写入Java String,JAXB上下文和marshaller如下:

Faxml.Person person = new Faxml.Person();
person.setName("ABC");
Faxml faxml = new Faxml();
faxml.setPerson(person);

生成的XML为:

JAXBContext jaxbContext = JAXBContext.newInstance(Faxml.class); 
Marshaller marshaller = jaxbContext.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FRAGMENT,Boolean.TRUE);
marshaller.setProperty(Marshaller.JAXB_NO_NAMESPACE_SCHEMA_LOCATION,"test.xsd");
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT,Boolean.TRUE);
        
StringWriter stringWriter = new StringWriter();
marshaller.marshal(faxml,stringWriter);
String xml = stringWriter.toString();
        
System.out.println(xml);
,
    String name= "name"     
    String createXml="<faxml xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"//
                      xsi:noNamespaceSchemaLocation="test.xsd">"//
                      +"<person>"//
                      +"<name>"+name+"</name>"//
                      +"</>person">"//
                      +"</faxml>";
                    Sysout(createXml);

在变量中获取名称。对这些行进行硬编码,然后像这样插入。