Jag skulle nog läsa in filen som en txt-buffer, plocka bort dtd-referensen med ett regexp och sedan spara filen temporärt för xml inläsning igen.
Känns som att det ska vara enklast.
4 svar · 384 visningar · startad av @nders
Hej!
Jag har ett problem.
På disk har jag en xml-fil med en dtd-deklaration.
Filen kan se ut så här:
<?xml version="1.0" encoding="iso-8859-1"?>
<!DOCTYPE foobar SYSTEM "http://foo.bar.se/dtd/foobar.dtd">
<foobar>
<foo msgid="DX1342142GZH">
<bar>
<Head>
...
...
</Head>
<Body>
...
...
</Body>
</ORDERS>
</foo>
</foobar>
Denna fil vill jag lägga in i ett objekt av typen MSXML2.DOMDocument, och det skulle inte vara några problem, egentligen.
Nu är det bara så att filen http://foo.bar.se/dtd/foobar.dtd inte alltid är tillgänglig, och då går inläsningen av min fina xml-fil åt pipsvängen. Den enkla, normalt fungerande, koden ser ut någonting sånt här i VB eller liknande språk:
Dim objDocRoot as MSXML2.IXMLDomElement
Dim objFoo As New MSXML2.DOMDocument
objFoo.validateOnParse = false
objFoo.async = False
objFoo.setProperty "ServerHTTPRequest", true
objFoo.load "c:\foo\bar\foobar.xml"
[i]set objDocRoot = objFoo.documentElement[/i]
Markerad kodrad ger ett Object required-felmeddelande då DTD:n är otillgänglig. (objFoo är 'Nothing')
Någon med idéer om hur jag säger åt mitt program att ge fullständigt fan i ett försöka validera det jag vill läsa in i objektet?
Måste jag spara en kopia av filen utan dtd-referens?
Mvh och tpf,
Jag skulle nog läsa in filen som en txt-buffer, plocka bort dtd-referensen med ett regexp och sedan spara filen temporärt för xml inläsning igen.
Känns som att det ska vara enklast.
Jag har funderat på den saken, men det känns som ett himskans felaktigt sätt att lösa problemet på. Jag vill ju lösa problemet på ett bra sätt, liksom. :)
Hmm...
Du har en extern DTD...
Har du testat om du kan använda resolveExternals (som kontrollerar huruvida "externa "delar" av dokumentet, t.ex. DTD:n, skall läsas in vid validering eller ej) för att komma förbi problemet på något sätt?
jarvklo, tack! :f
Du har återigen räddat mig ur en liten knipa.
Det verkar räcka alldeles utmärkt bara att lägga till resolveExternals=false.
Vad lätt allt är när man kan det. :)
Tack igen!