gpt4 book ai didi

java - XMLBeans - 处理命名空间

转载 作者:行者123 更新时间:2023-11-30 03:32:49 27 4
gpt4 key购买 nike

我使用 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();
}

所以这里我得到的输出为空。

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

有人可以帮我吗..

最佳答案

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

按照目前的编写,您的架构在架构的 targetNamespace 中声明顶级 ServerConfig 元素,但在 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>

您没有提供任何没有命名空间的 driverClassNameurl 等元素,因此 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>

附注命名空间标识符通常应该是 URI,因此您应该使用诸如 urn:serverDetail 或某些虚假的 http:// URL,而不是 serverDetail种类。

关于java - XMLBeans - 处理命名空间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28629245/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com