首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >XMLBeans -处理命名空间

XMLBeans -处理命名空间
EN

Stack Overflow用户
提问于 2015-02-20 12:39:38
回答 1查看 2.3K关注 0票数 1

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

现在,我为XML和XSD文件添加名称空间,重新编译并重新创建jar文件。在此之后,包名在java文件中更改,但是这里我面临问题,因为每个xsd parameter.Following都是XSD文件。

代码语言:javascript
复制
<?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文件

代码语言:javascript
复制
<?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类文件

代码语言:javascript
复制
     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。

代码语言:javascript
复制
 Server details
 DriverClassName null
 Url is null
 User is null
 Password is null

这里有人能帮我吗..。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-02-20 12:59:06

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

正如目前所写的,您的模式在模式的ServerConfig中声明了一个顶级的targetNamespace元素,但是complexType中的“本地”元素声明不包含targetNamespace,因此XMLBeans需要一个类似于

代码语言:javascript
复制
<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>

您没有提供任何没有命名空间的driverClassNameurl等元素,因此XMLBeans为相应的属性正确地提供了null。

如果希望本地元素也在targetNamespace中,则需要将elementFormDefault="qualified"添加到架构中。

代码语言:javascript
复制
   <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
               targetNamespace="serverDetail"
               elementFormDefault="qualified">

在此基础上,以下内容将成功地验证

代码语言:javascript
复制
<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>

命名空间标识符通常应该是URI,所以您应该使用类似于serverDetailurn:serverDetail或某种假的http:// URL。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28629245

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档