【问题标题】:Create XML string in java with custom namespace使用自定义命名空间在 java 中创建 XML 字符串
【发布时间】:2020-08-26 17:59:35
【问题描述】:

我想以编程方式在 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"?>

但我想要开始和结束标记 &lt;faxml&gt; 以及我在示例代码中提到的命名空间作为输出

【问题讨论】:

  • 您收到 XML 输入了吗?还是作为字符串?
  • 我想从一些从数据库中获取的数据中生成 xml,比如人名将来自数据库,但是 xml 的开头应该像 "w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation=" test.xsd">"
  • 我通常看到使用字段上的 JAXB 注释处理此问题 - example,或使用 package-info
  • @andrewjames 这有点帮助,但不能完全解决我的问题我不需要 xml 作为根标记我需要 作为我的根标记,并且根据发布的 xmlns:xsi 等
  • 了解 - 抱歉,我没有仔细阅读您的问题,这是我的错误。严格来说,开头行&lt;?xml...&gt; 是XML 声明(我认为也称为序言?)——我认为这是可选的。听起来您想要一个没有声明的 XML 文件,并且开始标记为 &lt;faxml...&gt; 您可以完全控制 JAXB 生成的标记;所以也许问题是:我如何禁止声明?(也许还有:这样做的后果是什么......?)

标签: java xml jaxb


【解决方案1】:

这是一种方法:

首先,这是我的代表所需 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 类嵌套在根类中 - 仅用于此测试。当然,还有其他方法可以排列这些类,因此它们不会嵌套。

然后我为org.ajames.jaxb.persons 定义package-info 如下:

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

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

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

JAXB 上下文和编组器如下,假设我们正在将 XML 写入 Java 字符串,用于此测试:

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);

生成的 XML 是:

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

【讨论】:

  • 感谢@andrewjames,您节省了很多时间!!
【解决方案2】:
    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);

在变量中获取名称。硬编码这些行并像这样插入它..

【讨论】:

  • 是的,这是可能的,但我将拥有一堆数据,而不仅仅是一个字段,我只提供了示例代码,但我想创建多个 bean 类,并且需要转换为这些 bean 类设置的值to xml with root as
  • 您可以为此创建一个类,并且可以初始化该方法。这样您就可以从所有类中调用此方法。你的意思是你会得到“名字”,“年龄”......这样吗?
  • 是的,我更新了我想要实现的问题,就像我提供的链接一样,但只需要替换输出中的 标记和名称空间
猜你喜欢
  • 2010-10-06
  • 1970-01-01
  • 2011-09-27
  • 2016-01-01
  • 2021-06-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-08
相关资源
最近更新 更多