【问题标题】:ID and IDREF configuration in XML and DTDXML 和 DTD 中的 ID 和 IDREF 配置
【发布时间】:2019-10-25 09:14:26
【问题描述】:

这是我第一次尝试 XML,我根本无法验证 xml。 DTD 得到验证,但 XML 没有得到验证。我无法弄清楚 ID 和 IDREF 部分。有人可以告诉我如何解决这个问题,因为我在尝试验证时不断收到错误“必须声明元素类型”,尤其是对于 medID 和 docID。

这是 XML

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE patient_list SYSTEM "patients.dtd">
<patient_list>
<patient serialNo="a1b2c3">
<patientFName>Jon</patientFName>
<patientLName>Won</patientLName>
<gender>male</gender>
<medID IDREF="M1"/>
<docID IDREF="D37"/>
</patient>

<patient serialNo="k4t5g2">
<patientFName>Min</patientFName>
<patientLName>Hin</patientLName>
<gender>female</gender>
<medID IDREF="M2"/>
<docID IDREF="D21"/>
</patient>

<medicine medID="M1">
<name>Panadol</name>
<manufacture>GSK</manufacture>
<regNo>oo9807</regNo>
</medicine>

<medicine medID="M2">
<name>Alprazolam</name>
<manufacture>Novartis</manufacture>
<regNo>hu5432</regNo>
</medicine>

<doctor docID="D21">
<registration ID="8472392"/>
<fName>Alfred</fName>
<lName>Campbell</lName>
<specialisation>Paediatrics</specialisation>
</doctor>

<doctor docID="D37">
<registration ID="4364786"/>
<fName>Mick</fName>
<lName>Foley</lName>
<specialisation>Psychiatry</specialisation>
</doctor>
</patient_list>

这是 DTD:

<!ELEMENT patient_list (patient+, medicine+, doctor+)>
<!ELEMENT patient (patientFName, patientLName, gender)>
<!ATTLIST patient serialNo CDATA #REQUIRED>
<!ELEMENT patientFName (#PCDATA)>
<!ELEMENT patientLName (#PCDATA)>
<!ELEMENT gender (#PCDATA)>

<!ATTLIST medicine medID ID #REQUIRED>
<!ATTLIST doctor docID ID #REQUIRED>

<!ELEMENT medicine (name, manufacture, regNo)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT manufacture (#PCDATA)>
<!ELEMENT regNo (#PCDATA)>

<!ELEMENT doctor (registration, fName, lName, specialisation)>
<!ELEMENT registration (#PCDATA)>
<!ATTLIST registration ID CDATA #REQUIRED>
<!ELEMENT fName (#PCDATA)>
<!ELEMENT lName (#PCDATA)>
<!ELEMENT specialisation (#PCDATA)>

【问题讨论】:

  • 嗯,XML 正在 被验证,否则你不会得到他的错误。错误是因为 DTD 将 patient 的内容模型声明为 (patientFName, patientLName, gender) 但您的实例也有 medIDdocID 元素。 DTD 不允许这些,因此它们被正确地拒绝了。

标签: xml dtd


【解决方案1】:

我认为medicine 上的medIDdoctor 上的docID 属性很好。它们都被声明为属性类型ID,就像它们应该的那样。

我认为您的问题发生在您尝试使用 medIDdocID 作为元素而不声明它们时。不要使用与medIDdocID 属性相同的名称,而是将它们命名为不同的名称,例如medrefdocref

属性IDREF 也需要声明,但是IDREF 是另一种属性类型,因此您应该将属性命名为refid 之类的其他名称。

完整示例...

XML

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE patient_list SYSTEM "patients.dtd">
<patient_list>
    <patient serialNo="a1b2c3">
        <patientFName>Jon</patientFName>
        <patientLName>Won</patientLName>
        <gender>male</gender>
        <medref refid="M1"/>
        <docref refid="D37"/>
    </patient>

    <patient serialNo="k4t5g2">
        <patientFName>Min</patientFName>
        <patientLName>Hin</patientLName>
        <gender>female</gender>
        <medref refid="M2"/>
        <docref refid="D21"/>
    </patient>

    <medicine medID="M1">
        <name>Panadol</name>
        <manufacture>GSK</manufacture>
        <regNo>oo9807</regNo>
    </medicine>

    <medicine medID="M2">
        <name>Alprazolam</name>
        <manufacture>Novartis</manufacture>
        <regNo>hu5432</regNo>
    </medicine>

    <doctor docID="D21">
        <registration ID="8472392"/>
        <fName>Alfred</fName>
        <lName>Campbell</lName>
        <specialisation>Paediatrics</specialisation>
    </doctor>

    <doctor docID="D37">
        <registration ID="4364786"/>
        <fName>Mick</fName>
        <lName>Foley</lName>
        <specialisation>Psychiatry</specialisation>
    </doctor>
</patient_list>

DTD

<!ELEMENT patient_list (patient+, medicine+, doctor+)>
<!ELEMENT patient (patientFName, patientLName, gender, medref*, docref*)>
<!ATTLIST patient serialNo CDATA #REQUIRED>
<!ELEMENT patientFName (#PCDATA)>
<!ELEMENT patientLName (#PCDATA)>
<!ELEMENT gender (#PCDATA)>

<!ATTLIST medicine medID ID #REQUIRED>
<!ATTLIST doctor docID ID #REQUIRED>

<!ELEMENT medref EMPTY>
<!ATTLIST medref refid IDREF #REQUIRED>

<!ELEMENT docref EMPTY>
<!ATTLIST docref refid IDREF #REQUIRED>

<!ELEMENT medicine (name, manufacture, regNo)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT manufacture (#PCDATA)>
<!ELEMENT regNo (#PCDATA)>

<!ELEMENT doctor (registration, fName, lName, specialisation)>
<!ELEMENT registration (#PCDATA)>
<!ATTLIST registration ID CDATA #REQUIRED>
<!ELEMENT fName (#PCDATA)>
<!ELEMENT lName (#PCDATA)>
<!ELEMENT specialisation (#PCDATA)>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多