【问题标题】:XML - How Can I Add a Second Entry?XML - 如何添加第二个条目?
【发布时间】:2015-06-27 01:28:03
【问题描述】:

我想尝试在我的 XML 文件中添加第二个条目,但是,在添加另一个条目时,验证器出现错误

代码: 这是我的 DTD:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<!DOCTYPE car [

    <!ELEMENT car (make, model, year, colour, engine, accessories)>

    <!ELEMENT make (#PCDATA)>
    <!ELEMENT model (#PCDATA)>
    <!ELEMENT year (#PCDATA)>
    <!ELEMENT colour (#PCDATA)>
    <!ELEMENT engine (number_of_cylinders, fuel_system)>
    <!ELEMENT number_of_cylinders (#PCDATA)>
    <!ELEMENT fuel_system (#PCDATA|carburetted|fueld-injected)*>
    <!ELEMENT accessories EMPTY>
        <!ATTLIST accessories radio (yes|no) #REQUIRED>
        <!ATTLIST accessories air_conditioning (yes|no) #REQUIRED>
        <!ATTLIST accessories power_steering (yes|no) #REQUIRED>
]>

XML 条目:

<car>
    <make>Ford</make>
    <model>001</model>
    <year>2014</year>
    <colour>black</colour>
    <engine> <number_of_cylinders>3</number_of_cylinders> <fuel_system>"carburetted"</fuel_system></engine>
    <accessories radio="yes" air_conditioning="yes" power_steering="yes"/>
</car>

【问题讨论】:

    标签: xml validation dtd w3c w3c-validation


    【解决方案1】:

    您只能拥有一个根元素,因此您需要添加另一个可以包含多个 car 元素的元素。

    类似:

    <!ELEMENT cars (car+)>
    

    我还注意到了其他一些事情。

    1. 您似乎在混淆internal and external subsets。不允许在外部子集中有 doctype 声明。在您给出的示例中,这应该都是一个文件。如果 DTD 在单独的文件中,请将 doctype 声明从 DTD 移动到 XML 实例并引用 DTD。

    2. 您可以通过每个元素仅使用 1 个来简化属性声明。

    3. 您引用了元素 carburettedfueld-injected,但没有声明它们。看起来您实际上想要 2 个值的选项。你不能用 DTD 做到这一点,所以你必须用枚举创建一个属性。

    这里有几个例子说明:

    • 内部子集
    • 外部子集
    • 额外的元素引用转换为type 属性
    • 属性声明简化
    • cars 元素的添加

    内部子集示例

    汽车.xml

    <!DOCTYPE cars [
    
    <!ELEMENT cars (car+)>
    
    <!ELEMENT car (make, model, year, colour, engine, accessories)>
    
    <!ELEMENT make (#PCDATA)>
    <!ELEMENT model (#PCDATA)>
    <!ELEMENT year (#PCDATA)>
    <!ELEMENT colour (#PCDATA)>
    <!ELEMENT engine (number_of_cylinders, fuel_system)>
    <!ELEMENT number_of_cylinders (#PCDATA)>
    <!ELEMENT fuel_system EMPTY>
    <!ATTLIST fuel_system
              type (carburetted|fuel-injected) #REQUIRED>
    <!ELEMENT accessories EMPTY>
    <!ATTLIST accessories 
              radio            (yes|no) #REQUIRED
              air_conditioning (yes|no) #REQUIRED
              power_steering   (yes|no) #REQUIRED>
    ]>
    <cars>
        <car>
            <make>Ford</make>
            <model>001</model>
            <year>2014</year>
            <colour>black</colour>
            <engine> 
                <number_of_cylinders>3</number_of_cylinders> 
                <fuel_system type="carburetted"/>
            </engine>
            <accessories radio="yes" air_conditioning="yes" power_steering="yes"/>
        </car>
    </cars>
    

    外部子集示例

    汽车.dtd

    <!ELEMENT cars (car+)>
    
    <!ELEMENT car (make, model, year, colour, engine, accessories)>
    
    <!ELEMENT make (#PCDATA)>
    <!ELEMENT model (#PCDATA)>
    <!ELEMENT year (#PCDATA)>
    <!ELEMENT colour (#PCDATA)>
    <!ELEMENT engine (number_of_cylinders, fuel_system)>
    <!ELEMENT number_of_cylinders (#PCDATA)>
    <!ELEMENT fuel_system EMPTY>
    <!ATTLIST fuel_system
              type (carburetted|fuel-injected) #REQUIRED>
    <!ELEMENT accessories EMPTY>
    <!ATTLIST accessories 
              radio            (yes|no) #REQUIRED
              air_conditioning (yes|no) #REQUIRED
              power_steering   (yes|no) #REQUIRED>
    

    汽车.xml

    <!DOCTYPE cars SYSTEM "cars.dtd">
    <cars>
        <car>
            <make>Ford</make>
            <model>001</model>
            <year>2014</year>
            <colour>black</colour>
            <engine> 
                <number_of_cylinders>3</number_of_cylinders> 
                <fuel_system type="carburetted"/>
            </engine>
            <accessories radio="yes" air_conditioning="yes" power_steering="yes"/>
        </car>
    </cars>
    

    【讨论】:

      【解决方案2】:

      如果您的意思是要添加另一辆车,那么您的定义需要更改。我建议根是汽车,并且您将汽车元素定位在其中。 DTD 需要修改以指定汽车包含多少子元素。见http://www.w3schools.com/dtd/dtd_elements.asp

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-12-31
        • 2016-04-29
        • 1970-01-01
        • 2019-10-11
        • 1970-01-01
        • 1970-01-01
        • 2012-09-08
        • 2018-11-18
        相关资源
        最近更新 更多