XMLBeans - обрабатывать пространство имен

Я заканчиваю учебник по xmlbean с XML-файлом и XSD-файлом и успешно получаю доступ ко всем данным.

Теперь я добавляю пространство имен для файла XML и XSD, перекомпилирую и воссоздаю файл jar. После этого изменение имени пакета в файле Java, но здесь я сталкиваюсь с проблемой, так как я получаю значение NULL для каждого параметра xsd. Ниже приведен файл XSD.

<?xml version="1.0" encoding="UTF-8"?>
   <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" targetNamespace="serverDetail">
<xsd:element name="ServerConfig">
    <xsd:complexType>
        <xsd:sequence>
            <xsd:element name="driverClassName" type="xsd:string"/>
            <xsd:element name="url" type="xsd:string"/>
            <xsd:element name="user" type="xsd:string"/>
            <xsd:element name="password" type="xsd:string"/>
        </xsd:sequence>
    </xsd:complexType>
</xsd:element>

Ниже приводится XML-файл

<?xml version="1.0" encoding="UTF-8"?>
<!-- Contains server details-->
<ServerConfig xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="serverDetail" xsi:SchemaLocation="serverConfig.xsd">
       <driverClassName>com.mysql.jdbc.Driver</driverClassName>
       <url>jdbc:mysql://localhost:3306/test</url>
       <user>root</user>
       <password>root</password>
</ServerConfig>

Ниже приведены файлы классов Java

     import serverDetail.ServerConfigDocument;
     import org.apache.xmlbeans.*;

     String filePath = "E:/Gradle/DemoTest/src/serverConfig.xml";
     java.io.File inputXMLFile = new java.io.File(filePath);
     try {
        ServerConfigDocument serverDoc= ServerConfigDocument.Factory.parse(inputXMLFile);
        ServerConfigDocument.ServerConfig serverConfig=serverDoc.getServerConfig();
        System.out.println("Server details\nDriverClassName " + serverConfig.getDriverClassName());
        System.out.println("Url is " + serverConfig.getUrl());
        System.out.println("User is " + serverConfig.getUser());
        System.out.println("Password is " + serverConfig.getPassword());
    } catch (XmlException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

Так что здесь я получаю вывод как ноль.

 Server details
 DriverClassName null
 Url is null
 User is null
 Password is null

Может кто-нибудь помочь мне здесь..

1 ответ

Решение

Краткий ответ: добавить elementFormDefault="qualified" к xsd:schema элемент.

Как написано в настоящее время, ваша схема объявляет верхний уровень ServerConfig элемент в схеме targetNamespace, но "локальные" объявления элементов внутри complexType не брать на себя targetNamespaceпоэтому XMLBeans ожидает документ XML, который выглядит как

<ns:ServerConfig xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                 xmlns:ns="serverDetail"
                 xsi:schemaLocation="serverDetail serverConfig.xsd">
   <driverClassName>com.mysql.jdbc.Driver</driverClassName>
   <url>jdbc:mysql://localhost:3306/test</url>
   <user>root</user>
   <password>root</password>
</ns:ServerConfig>

Вы не предоставили ни одного driverClassName, urlи т. д. элементы без пространства имен, поэтому XMLBeans правильно дает значение NULL для соответствующих свойств.

Если вы хотите, чтобы локальные элементы были в targetNamespace а потом нужно добавить elementFormDefault="qualified" к схеме

   <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
               targetNamespace="serverDetail"
               elementFormDefault="qualified">

с этим на месте следующее подтвердит успешно

<ServerConfig xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
              xmlns="serverDetail"
              xsi:schemaLocation="serverDetail serverConfig.xsd">
   <driverClassName>com.mysql.jdbc.Driver</driverClassName>
   <url>jdbc:mysql://localhost:3306/test</url>
   <user>root</user>
   <password>root</password>
</ServerConfig>

Идентификаторы пространства имен PS обычно должны быть URI, поэтому вместо serverDetail вы должны использовать что-то вроде urn:serverDetail или подделка http:// URL какой-то.

Другие вопросы по тегам