[xml] help with embedded DTD

Date view Thread view Subject view Author view

From: Fred_Smith@computrition.com
Date: Tue Jan 23 2001 - 13:16:21 EST


Gentlepersons:

I'm very wet behind the ears when it comes to XML. I'm trying to write some
(one hopes SIMPLE) code to construct a small XML document and I want that
document's DTD to be embedded, per the example below:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE CI7 [
     <!ELEMENT CI7 (MSG_HDR, PATIENT_INFORMATION, PATIENT_CLASS?,
PATIENT_TYPE?, ADMIT_DISCHARGE?, ALLERGIES?, DIAGNOSES?)>
     <!ELEMENT MSG_HDR (MSG_TYPE, MSG_DATE_TIME)>
     <!ELEMENT PATIENT_INFORMATION (MEDICAL_RECORD_NUMBER, PATIENT_ID?,
LAST_NAME, FIRST_NAME?, MIDDLE_NAME?, NICKNAME?, TITLE?, DOB?, SEX?,
RELIGION?, PRIMARY_LANGUAGE?, ROOM_LOCATION?)>
     <!ELEMENT PATIENT_CLASS (#PCDATA)>
     <!ELEMENT PATIENT_TYPE (#PCDATA)>
     <!ELEMENT ADMIT_DISCHARGE (ADMIT_DATE_TIME?, DISCHARGE_DATE_TIME?,
RETAIN_ON_DISCHARGE?)>
     <!ELEMENT ALLERGIES (ALLERGY+)>
     <!ELEMENT DIAGNOSES (DIAGNOSIS+)>
     <!ELEMENT MSG_TYPE (#PCDATA)>
     <!ELEMENT MSG_DATE_TIME (#PCDATA)>
     <!ELEMENT MEDICAL_RECORD_NUMBER (#PCDATA)>
     <!ELEMENT LAST_NAME (#PCDATA)>
     <!ELEMENT FIRST_NAME (#PCDATA)>
     <!ELEMENT MIDDLE_NAME (#PCDATA)>
     <!ELEMENT NICKNAME (#PCDATA)>
     <!ELEMENT TITLE (#PCDATA)>
     <!ELEMENT PATIENT_ID (#PCDATA)>
     <!ELEMENT DOB (#PCDATA)>
     <!--M : Male F: Female U:Unknown-->
     <!ELEMENT SEX (#PCDATA)>
     <!--Short name, please // for Religion and Primary Language-->
     <!ELEMENT RELIGION (#PCDATA)>
     <!ELEMENT PRIMARY_LANGUAGE (#PCDATA)>
     <!ELEMENT ROOM_LOCATION (#PCDATA)>
     <!ELEMENT ADMIT_DATE_TIME (#PCDATA)>
     <!ELEMENT DISCHARGE_DATE_TIME (#PCDATA)>
     <!ELEMENT RETAIN_ON_DISCHARGE (#PCDATA)>
     <!ELEMENT ALLERGY (ADD_DELETE, ALLERGY_ID, ALLERGY_NAME?)>
     <!--The ADD_DELETE node can have an ADD or DELETE entry.-->
     <!ELEMENT ADD_DELETE (#PCDATA)>
     <!ELEMENT ALLERGY_ID (#PCDATA)>
     <!ELEMENT ALLERGY_NAME (#PCDATA)>
     <!ELEMENT DIAGNOSIS (EXTERNAL_ID, START_DATE_TIME, END_DATE_TIME?,
DESCRIPTION?)>
     <!ELEMENT EXTERNAL_ID (#PCDATA)>
     <!ELEMENT START_DATE_TIME (#PCDATA)>
     <!ELEMENT END_DATE_TIME (#PCDATA)>
     <!ELEMENT DESCRIPTION (#PCDATA)>
]>
<CI7>
     <MSG_HDR>
          <MSG_TYPE>A01</MSG_TYPE>
          <MSG_DATE_TIME>20010115</MSG_DATE_TIME>
     </MSG_HDR>
     <PATIENT_INFORMATION>
          <MEDICAL_RECORD_NUMBER>123456789</MEDICAL_RECORD_NUMBER>
          <LAST_NAME>Smith</LAST_NAME>
     </PATIENT_INFORMATION>
     <ALLERGIES>
          <ALLERGY>
               <ADD_DELETE>ADD</ADD_DELETE>
               <ALLERGY_ID>132</ALLERGY_ID>
               <ALLERGY_NAME>chesse</ALLERGY_NAME>
          </ALLERGY>
     </ALLERGIES>
</CI7>

I've been reading through the mailing list archives and saw a series of
postings on the subject, but I cannot get it to embed the DTD so that it
looks like this example. Here's what I keep getting:

<?xml version="1.0"?>
<!DOCTYPE CI7 SYSTEM "CI7.dtd" [
<!ELEMENT CI7 (MSG_HDR , PATIENT_INFORMATION , PATIENT_CLASS? ,
PATIENT_TYPE? , ADMIT_DISCHARGE? , ALLERGIES? , DIAGNOSES?)>
<!ELEMENT MSG_HDR (MSG_TYPE , MSG_DATE_TIME)>
<!ELEMENT PATIENT_INFORMATION (MEDICAL_RECORD_NUMBER , PATIENT_ID? ,
LAST_NAME , FIRST_NAME? , MIDDLE_NAME? , NICKNAME? , TITLE? , DOB? , SEX? ,
 RELIGION? , PRIMARY_LANGUAGE? , ROOM_LOCATION?)>
<!ELEMENT PATIENT_CLASS (#PCDATA)>
<!ELEMENT PATIENT_TYPE (#PCDATA)>
<!ELEMENT ADMIT_DISCHARGE (ADMIT_DATE_TIME? , DISCHARGE_DATE_TIME? ,
RETAIN_ON_DISCHARGE?)>
<!ELEMENT ALLERGIES (ALLERGY)+>
<!ELEMENT DIAGNOSES (DIAGNOSIS)+>
<!ELEMENT MSG_TYPE (#PCDATA)>
<!ELEMENT MSG_DATE_TIME (#PCDATA)>
<!ELEMENT MEDICAL_RECORD_NUMBER (#PCDATA)>
<!ELEMENT LAST_NAME (#PCDATA)>
<!ELEMENT FIRST_NAME (#PCDATA)>
<!ELEMENT MIDDLE_NAME (#PCDATA)>
<!ELEMENT NICKNAME (#PCDATA)>
<!ELEMENT TITLE (#PCDATA)>
<!ELEMENT PATIENT_ID (#PCDATA)>
<!ELEMENT DOB (#PCDATA)>
<!--M : Male F: Female U:Unknown--><!ELEMENT SEX (#PCDATA)>
<!--Short name, please // for Religion and Primary Language--><!ELEMENT
RELIGION (#PCDATA)>
<!ELEMENT PRIMARY_LANGUAGE (#PCDATA)>
<!ELEMENT ROOM_LOCATION (#PCDATA)>
<!ELEMENT ADMIT_DATE_TIME (#PCDATA)>
<!ELEMENT DISCHARGE_DATE_TIME (#PCDATA)>
<!ELEMENT RETAIN_ON_DISCHARGE (#PCDATA)>
<!ELEMENT ALLERGY (ADD_DELETE , ALLERGY_ID , ALLERGY_NAME?)>
<!--The ADD_DELETE node can have an ADD or DELETE entry.--><!ELEMENT
ADD_DELETE (#PCDATA)>
<!ELEMENT ALLERGY_ID (#PCDATA)>
<!ELEMENT ALLERGY_NAME (#PCDATA)>
<!ELEMENT DIAGNOSIS (EXTERNAL_ID , START_DATE_TIME , END_DATE_TIME? ,
DESCRIPTION?)>
<!ELEMENT EXTERNAL_ID (#PCDATA)>
<!ELEMENT START_DATE_TIME (#PCDATA)>
<!ELEMENT END_DATE_TIME (#PCDATA)>
<!ELEMENT DESCRIPTION (#PCDATA)>
]>
In the second file (above) I've removed the document body as it is
unimportant for purposes of this dicsussion. Note the differences in the
!DOCTYPE tag.

I've got the body of the DTD stored in a local file and want to import it
into the document. I want it embedded in the document so that the receiver
does not need to have his own disk-based copy of the DTD's contents. The
DTD is stored in a file named "CI7.dtd". I don't want the !DOCTYPE tag to
include either the "SYSTEM" or the ""CI7.dtd"" fields, I want it just as
shown in the first file.

Here's an excerpt of the code I'm using to create the second file shown
above, can someone show me what I need to change to make it work in the
desired way?

#include <stdio.h>
#include <fcntl.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
#include <libxml/tree.h>
#include <libxml/SAX.h>
int main (int argc, char ** argv)
     {
     xmlDocPtr doc;
     xmlNodePtr root;
     xmlDtdPtr dtd;
     doc = xmlNewDoc("1.0");
     dtd = xmlParseDTD (NULL, "CI7.dtd");
     doc->intSubset = dtd;
     dtd->parent = doc;
     dtd->doc = doc;
     doc->children = (xmlNodePtr) dtd;

     root = xmlNewDocNode(doc, NULL, "EXAMPLE", NULL);
     xmlDocSetRootElement (doc, root);
<snip>
     }

I'd appreciate some pointers/help in accomplishing this, I've been going
crosseyed trying to read my way through the library hoping to figure it
out, but so far I'm merely going blind.

Thanks in advance!

Fred

----
Message from the list xml@rpmfind.net
Archived at : http://xmlsoft.org/messages/
to unsubscribe: echo "unsubscribe xml" | mail  majordomo@rpmfind.net


Date view Thread view Subject view Author view

This archive was generated by hypermail 2b29 : Tue Jan 23 2001 - 14:43:39 EST