XMLBeans - 处理命名空间
XMLBeans - Handle the namespace
我用 XML 文件和 XSD 文件完成了 xmlbean 教程并成功访问了所有数据。
现在我为 XML 和 XSD 文件添加命名空间重新编译并重新创建 jar 文件。在此之后 java 文件中的包名称更改但在这里我面临问题,因为我得到每个 xsd parameter.Following 的 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 class 个文件
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
中的 "local" 元素声明不接受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>
P.S。名称空间标识符通常应该是 URI,因此您应该使用 urn:serverDetail
或某种伪造的 http://
URL 之类的东西而不是 serverDetail
。
我用 XML 文件和 XSD 文件完成了 xmlbean 教程并成功访问了所有数据。
现在我为 XML 和 XSD 文件添加命名空间重新编译并重新创建 jar 文件。在此之后 java 文件中的包名称更改但在这里我面临问题,因为我得到每个 xsd parameter.Following 的 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 class 个文件
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
中的 "local" 元素声明不接受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>
P.S。名称空间标识符通常应该是 URI,因此您应该使用 urn:serverDetail
或某种伪造的 http://
URL 之类的东西而不是 serverDetail
。