XMLBeans - 处理命名空间

时间:2015-02-20 12:39:39

标签: java xml xslt xsd xmlbeans

我使用XML文件和XSD文件完成xmlbean教程并成功访问所有数据。

现在我添加XML和XSD文件重命名的命名空间并重新创建jar文件。在此之后,java文件中的包名称发生了变化,但在这里我遇到了问题,因为我为每个xsd参数获取了null。以下是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();
    }

所以我在这里得到输出为null。

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

任何人都可以帮助我..

1 个答案:

答案 0 :(得分:2)

简短回答:将elementFormDefault="qualified"添加到xsd:schema元素。

正如当前所写,您的架构在架构的ServerConfig中声明了顶级targetNamespace元素,但complexType中的“局部”元素声明不会占用{{1}因此,XMLBeans期望一个看起来像

的XML文档
targetNamespace

您没有提供任何<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等元素而没有命名空间,因此XMLBeans正确地为相应的属性提供了null。

如果您希望本地元素也在url中,那么您需要将targetNamespace添加到架构

elementFormDefault="qualified"

有了这个,以下将成功验证

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

P.S。名称空间标识符通常应该是URI,因此您应该使用类似<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> 或某种虚假serverDetail URL的内容来代替urn:serverDetail