Solved

DTD Reference from a DOMDocument

Posted on 2001-07-05
12
643 Views
Last Modified: 2013-11-19
Here's one for you MSXML gurus.

I am creating an XML file using the DOMDocument object in VB, building nodes, but I can't figure out how to reference a DTD so that MyXMLDOMDocument.xml gives me back the <!DOCTYPE> node.   Anyone know how to
1.) Reference a DTD from the DOM
2.) Create a node that references the DTD from the DOM

Thanks all!
0
Comment
Question by:hvest
  • 5
  • 4
  • 2
  • +1
12 Comments
 
LVL 2

Expert Comment

by:Lunchy
ID: 6256601
You posted this question twice.  Just to let you know I deleted the duplicate.

Lunchy
Community Support Moderator
0
 
LVL 5

Expert Comment

by:mattyk
ID: 6256715
Have you taken a look at the doctype property?  So for a sample xml like:

<?xml version="1.0"?>
<!DOCTYPE note SYSTEM "note.dtd">
<note>
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
</note>

the following code would give me note:

Dim objXML As New MSXML2.DOMDocument
objXML.Load ("E:\ee.xml")
debug.print(objXML.doctype.basename)
debug.print(objXML.doctype.xml)

-matty


0
 

Author Comment

by:hvest
ID: 6256836
Unfortunately, I don't have an xml file to load...I am actually building the XML on the fly using the XMLDOM and SQL data.  Thus I need to reference the DTD in the DOM so that MyDOMDocument.xml would yield:

<?xml version="1.0"?>
<!DOCTYPE note SYSTEM "note.dtd">
<blah></blah>

I can do everything but the <!Doctype> node.

Basically I either need to set the doctype property of my DOMDocument (but doctype is read-only), or reference an external DTD from inside of my DOMDocument
0
Netscaler Common Configuration How To guides

If you use NetScaler you will want to see these guides. The NetScaler How To Guides show administrators how to get NetScaler up and configured by providing instructions for common scenarios and some not so common ones.

 
LVL 5

Expert Comment

by:mattyk
ID: 6257225
Well I came across this:


which hints that the only way to accomplish this is to take your current xml , convert it to a string, add the <!Doctype> node and then reload the string back into the DOMDocument object.

http://www.vbxml.com/xml/articles/dom_xml_prog/default-19.asp?printerversion=true

-matty
0
 
LVL 8

Expert Comment

by:Dave_Greene
ID: 6257298
Why not, when you first create the DOM create it by adding a string... then you can append the desired nodes

Dim objXML As New MSXML2.DOMDocument

strTemp = "<?xml version='1.0'?><!DOCTYPE note SYSTEM 'note.dtd'>"


objXML.xml = strTemp
0
 

Author Comment

by:hvest
ID: 6257306
I wonder if there is any other way?  I haven't been able to find one yet...
0
 

Author Comment

by:hvest
ID: 6257315
That's a good suggestion Dave, but .xml is a read-only property
0
 
LVL 8

Expert Comment

by:Dave_Greene
ID: 6257329
It's been a couple of months since I've worked with it, just found your question... I'll see what I can come up with...
0
 
LVL 8

Accepted Solution

by:
Dave_Greene earned 300 total points
ID: 6257465
Ok, here it is...  Another unfortunate limitation of XML & DTDs.  As far as accomplishing what you want in code, you will need to create a text file programmatically with your version / DTD info...

<?xml version="1.0"?>
<!DOCTYPE note SYSTEM "note.dtd">

Then you will need to load this file into your DOM

objDOM.load "C:\Temp\temp.xml"

Then append your nodes as needed.

There is no easy way around this one.

It would be nice if it worked like Matty and I initially thought (Build the string and pop it into the DOM), but no beans.

Hope this helps!

-Dave
0
 

Author Comment

by:hvest
ID: 6257517
Thanks Dave!  Looks like I just got the short end of the stick on this problem...gonna have to go with the work-around
0
 
LVL 8

Expert Comment

by:Dave_Greene
ID: 6257558
Just one last note,

When using an internal DTD you do not need to define SYSTEM OR PUBLIC  ...  or an external file name...

Just

<!DOCTYPE note>

Cheers
0
 
LVL 8

Expert Comment

by:Dave_Greene
ID: 6257563
And of course...

Whatever DTD elements

<!DOCTYPE note[
    <!-- this is where the internal DTD subset is located. -->
  ]>
  <note>

Have a good one!
0

Featured Post

VMware Disaster Recovery and Data Protection

In this expert guide, you’ll learn about the components of a Modern Data Center. You will use cases for the value-added capabilities of Veeam®, including combining backup and replication for VMware disaster recovery and using replication for data center migration.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Suggested Solutions

What is Node.js? Node.js is a server side scripting language much like PHP or ASP but is used to implement the complete package of HTTP webserver and application framework. The difference is that Node.js’s execution engine is asynchronous and event…
You can of course define an array to hold data that is of a particular type like an array of Strings to hold customer names or an array of Doubles to hold customer sales, but what do you do if you want to coordinate that data? This article describes…
Viewers will learn about if statements in Java and their use The if statement: The condition required to create an if statement: Variations of if statements: An example using if statements:
The viewer will learn how to look for a specific file type in a local or remote server directory using PHP.

809 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question