首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在本地将命名空间分配给元素

在本地将命名空间分配给元素
EN

Stack Overflow用户
提问于 2013-04-17 22:25:27
回答 1查看 58关注 0票数 0

我有一个xml文件。我不能更改xml结构,因此我必须更改xsd文件。问题与名称空间有关

代码语言:javascript
运行
复制
<po:purchaseOrder orderDate="2001-01-01" xmlns:po="http://objectshop.com/ns/po" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://objectshop.com/ns/po po.xsd ">
<shipTo country="USA">
    <name>Alice Smith</name>
    <street>123 Maple Street</street>
    <city>Cambridge</city>
    <state>MA</state>
    <postalcode>12345</postalcode>
</shipTo>
</po:purchaseOrder>

所以通常情况下,我应该在每个元素中都加上ns。如果我这么做了,那就没问题了。问题是如何设计xsd文件。特别是如何在xsd中本地分配命名空间?

代码语言:javascript
运行
复制
<?xml version="1.0" encoding="UTF-8"?>
<schema targetNamespace="http://objectshop.com/ns/po"
elementFormDefault="qualified" xmlns="http://www.w3.org/2001/XMLSchema"
xmlns:po="http://objectshop.com/ns/po">

<complexType name="PurchaseOrderType">
    <sequence>
        <element name="shipTo" type="po:Address" maxOccurs="unbounded" minOccurs="0" ></element>
        <element name="billTo" type="po:Address" maxOccurs="unbounded" minOccurs="0"></element>
        <element name="items" type="po:Items" maxOccurs="unbounded" minOccurs="0"></element>
    </sequence>

    <attribute name="orderDate" type="date"></attribute>
</complexType>
</schema>
EN

回答 1

Stack Overflow用户

发布于 2013-04-18 07:47:54

您发布的XSD是不完整的,所以很难说您的设置是什么。因此,我将基于XML解释两种不同的选项。应该针对你的具体情况进行说明。

如果我从XML开始,并从它生成XSD,您通常会得到以下结果:

XSD1:

代码语言:javascript
运行
复制
<?xml version="1.0" encoding="utf-8"?>
<!--XML Schema generated by QTAssistant/XML Schema Refactoring (XSR) Module (http://www.paschidev.com)-->
<xsd:schema xmlns:po="http://objectshop.com/ns/po" attributeFormDefault="unqualified" elementFormDefault="qualified" targetNamespace="http://objectshop.com/ns/po" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <xsd:import schemaLocation="XSD2.xsd" />
  <xsd:element name="purchaseOrder">
    <xsd:complexType>
      <xsd:sequence>
        <xsd:element ref="shipTo" />
      </xsd:sequence>
      <xsd:attribute name="orderDate" type="xsd:date" use="required" />
    </xsd:complexType>
  </xsd:element>
</xsd:schema>

XSD2:

代码语言:javascript
运行
复制
<?xml version="1.0" encoding="utf-8"?>
<!--XML Schema generated by QTAssistant/XML Schema Refactoring (XSR) Module (http://www.paschidev.com)-->
<xsd:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <xsd:element name="shipTo">
    <xsd:complexType>
      <xsd:sequence>
        <xsd:element name="name" type="xsd:string" />
        <xsd:element name="street" type="xsd:string" />
        <xsd:element name="city" type="xsd:string" />
        <xsd:element name="state" type="xsd:string" />
        <xsd:element name="postalcode" type="xsd:unsignedShort" />
      </xsd:sequence>
      <xsd:attribute name="country" type="xsd:string" use="required" />
    </xsd:complexType>
  </xsd:element>
</xsd:schema>

这两个XSD验证您发布的XML。它们展示的是如何引用没有名称空间的内容--这就是我认为您的问题所在。

但是,也可以使用一个XSD文件来描述这样的XML。“说明”是指只有文档元素是合格的(在本例中是purchaseOrder),而其他元素都是“不合格的”。要在默认情况下实现这一点,需要使用elementFormDefault="unqualified"设置模式。

代码语言:javascript
运行
复制
<?xml version="1.0" encoding="utf-8"?>
<!--XML Schema generated by QTAssistant/XML Schema Refactoring (XSR) Module (http://www.paschidev.com)-->
<xsd:schema xmlns:po="http://objectshop.com/ns/po" attributeFormDefault="unqualified" elementFormDefault="unqualified" targetNamespace="http://objectshop.com/ns/po" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <xsd:element name="purchaseOrder" type="po:PurchaseOrderType"/>
    <xsd:complexType name="PurchaseOrderType">
        <xsd:sequence>
            <xsd:element name="shipTo" type="po:Address" minOccurs="0" maxOccurs="unbounded"/>
        </xsd:sequence>
        <xsd:attribute name="orderDate" type="xsd:date" use="required"/>
    </xsd:complexType>
    <xsd:complexType name="Address">
        <xsd:sequence>
            <xsd:element name="name" type="xsd:string"/>
            <xsd:element name="street" type="xsd:string"/>
            <xsd:element name="city" type="xsd:string"/>
            <xsd:element name="state" type="xsd:string"/>
            <xsd:element name="postalcode" type="xsd:unsignedShort"/>
        </xsd:sequence>
        <xsd:attribute name="country" type="xsd:string" use="required"/>
    </xsd:complexType>
</xsd:schema>

或者,对于每个元素/属性,您可以通过设置form属性来覆盖模式级别的默认设置。下面是一个示例(它仅用于说明,并不是为了匹配您的XML)。

代码语言:javascript
运行
复制
<xsd:element name="name" type="xsd:string" form="qualified"/>
<xsd:attribute name="country" type="xsd:string" use="required" form="qualified"/>

在这种情况下,XML应该是:

代码语言:javascript
运行
复制
<po:purchaseOrder orderDate="2001-01-01" xmlns:po="http://objectshop.com/ns/po" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://objectshop.com/ns/po po.xsd ">
    <shipTo po:country="USA">
        <po:name>Alice Smith</po:name>
        <street>123 Maple Street</street>
        <city>Cambridge</city>
        <state>MA</state>
        <postalcode>12345</postalcode>
    </shipTo>
</po:purchaseOrder> 
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16062680

复制
相关文章

相似问题

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