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 какой-то.