[C#] XmlDocument en DTD's

Pagina: 1
Acties:

  • bimm
  • Registratie: November 2005
  • Laatst online: 21-02 13:42
Ik heb een probleem met de XmlDocument en een XML met daarin een DTD declaratie. Zodra er een dtd bovenin de XML file zit werkt mijn path expressie niet meer. Waar gaat het over:

XML:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?xml version="1.0"?>
<!DOCTYPE package PUBLIC "+//DTD OEB 1.2 Package//EN" "http://openebook.org/dtds/oeb-1.2/oebpkg12.dtd">
<package unique-identifier="oebps12package">
  <metadata>
    <dc-metadata xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:oebpackage="http://openebook.org/namespaces/oeb-package/1.0/">
      <dc:Title>Jaapjan's folly</dc:Title>
      <dc:Identifier scheme="uri" id="oebps12package">http://openebook.org/specifications/oeb-ps/1.2/</dc:Identifier>
      <dc:Language>en-US</dc:Language>
    </dc-metadata>
  </metadata>
  <manifest>
    <item id="jaapjanfolly" href="jaapjanfolly.html" media-type="text/html" />
  </manifest>
  <spine>
    <itemref idref="jaapjanfolly" />
  </spine>
</package>


C#:
1
2
3
XmlDocument opfDocument = new XmlDocument();
opfDocument.Load(Filename);
XmlNodeList metaNode = opfDocument.DocumentElement.SelectNodes("metadata");


Aan het einde van deze code is metaNode = null. Dit moet niet. Echter, als ik er dit van maak dan werkt de code wel:

C#:
1
2
3
4
XmlDocument opfDocument = new XmlDocument();
opfDocument.XmlResolver = null;
opfDocument.Load(Filename);
XmlNodeList metaNode = opfDocument.DocumentElement.SelectNodes("metadata");


Ik krijg geen exception echter in beide gevallen dus de DTD wordt misschien/denk ik wel gevonden. Heeft iemand de oplossing die ik nog niet weer?

Ik ook, jij niet?


  • H!GHGuY
  • Registratie: December 2002
  • Niet online

H!GHGuY

Try and take over the world...

heb je in de debugger al eens de DocumentElement goed bekeken ?

ASSUME makes an ASS out of U and ME


  • bimm
  • Registratie: November 2005
  • Laatst online: 21-02 13:42
Ja? Maar... hoezo dan?

Ik ook, jij niet?


  • CaptBiele
  • Registratie: Juni 2002
  • Laatst online: 27-08-2021

CaptBiele

No Worries!

misschien wordt je doctype declaratie als documentElement beschouwd. Daar zitten geen nodes onder, en dus is metaCode null.

  • bimm
  • Registratie: November 2005
  • Laatst online: 21-02 13:42
Nee, de document element bevat netjes de rest van de XML....snap er niets van.

Er zijn mensen op google die dit probleem ook hebben in een vorm of een ander...en die knippen het er gewoon uit om te laten werken...

Maar dan ben ik net weer -te- om te willen weten hoe het dan wel werkt...het lijkt te maken te hebben met de dtd resolver...maar waarom dan?

Ik ook, jij niet?


  • H!GHGuY
  • Registratie: December 2002
  • Niet online

H!GHGuY

Try and take over the world...

ik heb 3 seconden op de MSDN gekeken en heb gezien dat je fout bent.

kijk nog eens goed naar welke methode je nodig hebt of hoe je deze methode moet gebruiken...

ASSUME makes an ASS out of U and ME


  • bimm
  • Registratie: November 2005
  • Laatst online: 21-02 13:42
Beetje merkwaardige reactie. Ik kijk op Google en MSDN en vindt niet de oplossing en jij denkt deze te hebben gevonden op MSDN?

Misschien dat je een linkje kan geven dan waar je deze zag dan? Dat scheelt een hoop tijd, anders kan ik opnieuw gaan zoeken met de kans dat ik het niet zie...en die drie seconden van jouw wil je mij vast wel bieden.

Ik neem aan dat je mijn stukje voorbeeld code dan even hebt bekeken in VC# ?

Ik ook, jij niet?


  • H!GHGuY
  • Registratie: December 2002
  • Niet online

H!GHGuY

Try and take over the world...

kijk eens naar de SelectNodes functie....

die verwacht een XPath.
bvb:
C#:
1
XmlNode node = document.DocumentElement.SelectNodes("/package/metadata");

ASSUME makes an ASS out of U and ME


  • bimm
  • Registratie: November 2005
  • Laatst online: 21-02 13:42
Kijk, ik wil niet flauw zijn maar heb je mijn code geprobeerd?

"metanode" is een prima expressie. En deze werkt ook nog eens heel goed zolang je de doctype regel weghaald. Probeer het maar eens in je VC#. Gewoon die xml hierboven knippen en plakken en die drie regeltjes. Een debug breakpointje en je ziet het effect.

Met doctype regel werkt de "metanode" expressie niet en zonder doctype werkt het wel prima (wat ook niet fout is).

Dan kun je gelijk ook zien dat de DocumentElement ook prima is.

Ik ook, jij niet?


Verwijderd

Ik ben niet zo handig in het lezen van DTD's. Maar volgens mij specificeert deze DTD een namespace (als dat niet zo is, dan zit ik fout).
Ik heb ongeveer hetzelfde probleem gehad, maar dan niet met de DTD, maar met een namespace die gewoon in de xml stond.

Die namespace zorgt ervoor dat je xPath-expressie geen resultaat oplevert en ook geen foutmelding geeft, aangezien de expressie correct is.

Als er een namespace gedefinieerd is, moet je deze ook specificeren bij je xPath-expressie.

Hiervoor heb je een namespacemanager nodig, geloof ik. Dit is wel te vinden in google of de help.

  • bimm
  • Registratie: November 2005
  • Laatst online: 21-02 13:42
Ja en nee, er zijn inderdaad twee namespaces gedefineerd...

Om deze velden op te kunnen vragen met een xpath expressie moet je inderdaad een namespace manager gebruiken, anders krijg je ze niet. Alleen de twee namespaces zitten op een dieper niveau. Metadata heeft geen namespace.

Tenminste niet zoals ik het lees, er is geen xlmns daar volgens de xml en volgens de DTD.

Ik ook, jij niet?


Verwijderd

Aangezien ik al had gezegd dat ik niet zo handig ben in het lezen van een DTD, hier toch maar een fragment waar volgens mij de namespace wordt gedefinieerd (misschien zie ik het helemaal fout, en ik heb geen zin/tijd om de werking van een DTD te gaan uitzoeken):

<!ELEMENT package (metadata, manifest, spine, tours?, guide?)>
<!ATTLIST package
%CommonAttributes;
unique-identifier IDREF #REQUIRED
xmlns %URI; #FIXED %oebpk.xmlns;>
Pagina: 1