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

JAXB封送没有忽略名称空间

岳阳文
2023-03-14

我花了一些时间来调查是什么问题,但我不能解决它。当我在XML下面反封送和回封送时,我看到的是不同的XML。

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<root>
 <one>test</one>
 <three>\MySG\test.jsp</three>
 <two>
    <st>
        <seeta>
            <Source>

                <problemtag xmlns="uuid:B89290D2-36FB-4EBC-A581-69B16D59EB92">
                    <p>deploy_test_page_renderingMetadata</p>
                </problemtag>
            </Source>
        </seeta>
        <Template id="tcm:1-63-32" title="Smart Compound Component Template"/>
        <Publication id="tcm:0-1-1" title="Publication"/>
    </st>
 </two>
</root>
  • 在上面的xml中,只有一个标记(第一个),其余所有(包括名称空间)都是意外元素。另一个应用程序发送上述XML。
    package com.seeta.xml;

import java.util.ArrayList;
import java.util.List;

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlAnyElement;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement(name="root")
@XmlAccessorType(XmlAccessType.FIELD)
public class Root {
    @XmlElement(name="one")
    private String one;

    public String getOne() {
        return one;
    }

    public void setOne(String one) {
        this.one = one;
    }

    @XmlElement(name="three")
    private String three;

    @XmlAnyElement
    private List<Object> remaining = new ArrayList<Object>();


    public String getThree() {
        return three;
    }

    public void setThree(String three) {
        this.three = three;
    }

    public List<Object> getRemaining() {
        return remaining;
    }

    public void setRemaining(List<Object> remaining) {
        this.remaining = remaining;
    }

    public String toString() {
        return String.format("One [%s]-> Number of remaing elements [%d]-> three [%s]", one, remaining.size(), three);
    }
}
package com.seeta.xml;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.StringWriter;
import java.net.URL;
import java.net.URLDecoder;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import javax.xml.bind.Unmarshaller;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;

import org.w3c.dom.Document;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
        public class JaxbSample {

        public Document getDOMDocument(InputStream inputStream) throws ParserConfigurationException, SAXException, IOException {
            DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
            documentBuilderFactory.setNamespaceAware(true);
            DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
            if (inputStream != null) {
                return documentBuilder.parse(new InputSource(inputStream));
            } else {
                return documentBuilder.newDocument();
            }
        }
        public Root unmarshall(Document document) throws JAXBException {
            JAXBContext context = JAXBContext.newInstance(Root.class);
            Unmarshaller unmarshaller = context.createUnmarshaller();
            Root root = (Root) unmarshaller.unmarshal(document);
            return root;
        }

        public Document marshall(Root root) throws JAXBException, ParserConfigurationException, SAXException, IOException {
            JAXBContext context = JAXBContext.newInstance(Root.class);
            Marshaller marshaller = context.createMarshaller();
            Document document = getDOMDocument(null);
            marshaller.marshal(root, document);
            return document;
        }

        private String transform(Document document) throws TransformerException {
            StringWriter sw = new StringWriter();
            TransformerFactory transformerFactory = TransformerFactory.newInstance();
            Transformer transformer = transformerFactory.newTransformer();
            transformer.setOutputProperty(OutputKeys.INDENT, "yes");
            transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes");
            transformer.transform(new DOMSource(document), new StreamResult(sw));
            return sw.toString();
        }

        public void testUnmarshallMarshallUsingDocument() throws ParserConfigurationException, SAXException, IOException, JAXBException, TransformerException {
            InputStream inputStream = this.getClass().getResourceAsStream("jaxb.xml");
            Document document = getDOMDocument(inputStream);
            Root root = unmarshall(document);
            Document documentAfterMarshal = marshall(root);
            String output = transform(documentAfterMarshal);
            System.out.println(output);
        }

        public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException, JAXBException, TransformerException {
            JaxbSample jaxbTest = new JaxbSample();
            jaxbTest.testUnmarshallMarshallUsingDocument();
        }
    }
    <root>
<one>test</one>
<three>\MySG\test.jsp</three>
<two>
<st>
<seeta>
<Source>
<problemtag:problemtag xmlns="uuid:B89290D2-36FB-4EBC-A581-69B16D59EB92" xmlns:problemtag="uuid:B89290D2-36FB-4EBC-A581-69B16D59EB92">
<p>deploy_test_page_renderingMetadata</p>
                </problemtag:problemtag>
            </Source>
        </seeta>
<Template id="tcm:1-63-32" title="Smart Compound Component Template"/>
<Publication id="tcm:0-1-1" title="Publication"/>
    </st>
 </two>
</root>
    null

我真的不明白QName的事

共有1个答案

马国源
2023-03-14

如果您想要的只是保留未使用的元素并将其重新整理,我认为您应该能够做这样的事情:

@XmlRootElement(name="Root")
@XmlAccessorType(XmlAccessType.FIELD)
class Root {
    @XmlElement(name="One")
    private String one;

    @XmlAnyElement
    private List<Any> otherElements;
}

class AnyAdapter extends XmlAdapter<Element,Any> {
    @Override
    public Any unmarshal(Element element) throws Exception {
        return new Any(element);
    }

    @Override
    public Element marshal(Any any) throws Exception {
        return any.element;
    }
}

@XmlJavaTypeAdapter(AnyAdapter.class)
class Any {
    Element element;

    Any(Element element) {
        this.element = element;
    }
}
 类似资料:
  • 我正在开发一个客户端来使用 Web 服务,但由于某种原因,除非所有命名空间都正确且没有任何前缀,否则我的请求没有得到正确处理。 我所有的类都是由服务提供商使用提供的XSD和WSDL创建的。 NfeDadosMsg.class 包装信息.java TConsStatServ.class package br.inf.portalfiscal.nfe; 包装信息.java 输出xml: 由于某种原因,

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

  • 我有5个schemas.xsd,用于生成Java类,然后封送XML文件。 问题是只有一种情况--对于这个文件,JAXB生成额外的名称空间前缀NS2。这是非常奇怪的,因为所有模式都是相同的,并且编组机制对于所有模式都是通用的。 生成机制: 对于不能正常工作的包: 包信息: 对象-工厂 良好工作包: 包信息: 和对象工厂看起来完全一样(当然除了命名)。

  • 当我试图使用包含名称空间的JAXB将xml转换为Java对象时,会发生错误。 示例示例:' Zeta Walnes ` 我需要忽略名称空间

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

  • 问题内容: 我有一个正在建立的用于访问Web服务的客户端。我正在使用一些JAXB生成的类(Netbeans 6.9)来解组我的xml数据。 尝试从此Web服务解组InputStream响应时遇到意外元素错误,如果将响应保存到文件中,也会遇到相同的意外元素错误。 将数据保存到文件后,我可以进入并删除SOAP标签(信封,正文,标题),然后毫无问题地进行解组。 我还没有真正找到一种使拆封忽略这些标签的方