Solved

DTD Reference from a DOMDocument

Posted on 2001-07-05
12
647 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
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
  • 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
Secure Your WordPress Site: 5 Essential Approaches

WordPress is the web's most popular CMS, but its dominance also makes it a target for attackers. Our eBook will show you how to:

Prevent costly exploits of core and plugin vulnerabilities
Repel automated attacks
Lock down your dashboard, secure your code, and protect your users

 
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

PeopleSoft Has Never Been Easier

PeopleSoft Adoption Made Smooth & Simple!

On-The-Job Training Is made Intuitive & Easy With WalkMe's On-Screen Guidance Tool.  Claim Your Free WalkMe Account Now

Question has a verified solution.

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

This article covers the basics of the Sass, which is a CSS extension language. You will learn about variables, mixins, and nesting.
JavaScript has plenty of pieces of code people often just copy/paste from somewhere but never quite fully understand. Self-Executing functions are just one good example that I'll try to demystify here.
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:
This tutorial will teach you the core code needed to finalize the addition of a watermark to your image. The viewer will use a small PHP class to learn and create a watermark.

726 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