有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java在解组xml时忽略前缀(命名空间)

我有以下XML:

<?xml version="1.0" encoding="UTF-8"?>
<s:XXMsg xmlns:s="com:sample:test:msg">
    <s:Header>
        <s:cpyCod>xxx</s:cpyCod>
        <s:appCod>yyy</s:appCod>
    </s:Header>
</s:XXMsg>

我希望将其解组到以下Java类中:

public class XXHeader
{
    private String cpyCod;
    private String appCod;
}

我编写了以下代码:

    XMLInputFactory inputFactory = XMLInputFactory.newInstance();
    inputFactory.setProperty(XMLInputFactory.IS_NAMESPACE_AWARE, true);
    try
    {
        XMLStreamReader streamReader = inputFactory
            .createXMLStreamReader(Test.class.getClassLoader().getResourceAsStream("xxmsg.xml"));
        while (streamReader.hasNext())
        {
            int next = streamReader.next();
            if (streamReader.getEventType() == XMLStreamReader.START_ELEMENT
                && streamReader.getLocalName().equals("Header"))
            {
                JAXBContext context = JAXBContext.newInstance(XXHeader.class);
                Unmarshaller unmarshaller = context.createUnmarshaller();
                XXHeader xxHeader = unmarshaller.unmarshal(streamReader, XXHeader.class).getValue();
                System.out.println(xxHeader);
                break;
            }
        }

我将XXHeader的所有字段值作为null获取。但是如果我确实更改了xml并删除了每个元素中的前缀s:,那么我就得到了正确的值

如何在解组以获得正确值时忽略此前缀

PS:不鼓励在XXHeader类中使用@XML**注释


共 (2) 个答案

  1. # 1 楼答案

    我可以使用前面提到的here来实现这一点:

    public class XXHeaderXMLReader
        extends StreamReaderDelegate
    {
    
        public XXHeaderXMLReader(XMLStreamReader paramXMLStreamReader)
        {
            super(paramXMLStreamReader);
        }
    
        @Override
        public String getAttributeNamespace(int paramInt)
        {
            return "";
        }
    
        @Override
        public String getNamespaceURI()
        {
            return "";
        }
    
    }
    

    并在前面的代码中添加该行:

    XMLInputFactory inputFactory = XMLInputFactory.newInstance();
    inputFactory.setProperty(XMLInputFactory.IS_NAMESPACE_AWARE, true);
    try
    {
        XMLStreamReader streamReader = inputFactory
            .createXMLStreamReader(DocumentTest.class.getClassLoader().getResourceAsStream("xxmsg.xml"));
        while (streamReader.hasNext())
        {
            int next = streamReader.next();
            if (streamReader.getEventType() == XMLStreamReader.START_ELEMENT)
            {
                if (streamReader.getLocalName().equals("Header"))
                {
                    JAXBContext context = JAXBContext.newInstance(XXHeader.class);
                    Unmarshaller unmarshaller = context.createUnmarshaller();
                    XXHeaderXMLReader xxHeaderXMLReader = new XXHeaderXMLReader(streamReader);
                    XXHeader xxHeader =
                        unmarshaller.unmarshal(xxHeaderXMLReader, XXHeader.class).getValue();
                    System.out.println(xxHeader);
                    break;
                }
            }
        }
    }
    catch (XMLStreamException e)
    {
        e.printStackTrace();
    }
    catch (JAXBException e)
    {
        e.printStackTrace();
    }
    
  2. # 2 楼答案

    Here您可以找到有关忽略名称空间的有用信息,或者您可以定义XML模式(带有字段描述)并使用它来代替com:sample:test:msg