Results 1 to 5 of 5

Thread: Hoe krijg ik een namespace in een attribut van een XML element

  1. #1
    Senior Member
    Join Date
    Mar 2002
    Location
    Edam
    Posts
    426

    Hoe krijg ik een namespace in een attribut van een XML element

    Hoi,

    Ik heb een XML bestand waaraan ik een objecten wil toevoegen:

    <?xml version="1.0"?>
    <rtba:rtba0102 xmlns:rtba="http://www.rtba.nl/rtba0102/4.3.0">

    <rtbabj bronid="899358401" rtba:id="166682567">
    <rtba:naam>naam_0</rtba:naam>
    <rtba:gewicht unittype="gr">728</rtba:gewicht>
    <rtba:aantal>6</rtba:aantal>
    </rtbabj>

    </rtba:rtba0102>

    Het toevoegen van object-elementen gaat prima met uizondering van het meegeven van het tweede attribuut van het object attribuut( rtba:id).
    Dat moet volgens de externe validatieprocedure expliciet een namespace prefix hebben.

    maar:

    Delphi Code:
    1. xmldocument1.Options := [doNodeAutoCreate, doNodeAutoIndent,doAutoPrefix, doNamespaceDecl];
    2.  
    3. ndE:= XMLDocument1.DocumentElement;
    4. ndC:=ndE.AddChild('obj');
    5. ndC.setAttributeNS('id','','123456');  // geen namespace bij het attribute, logisch
    6. ndC.setAttributesNS('id','rtba','123456'); //"namespace error"


    Ik geeft nu als attribute maar even overal 'rtbaid' mee en die verander ik in een laatste bewerking van de XML-tekst in één keer via srtingreplace in 'rtba:id' maar dat moet toch op een nettere manier te regelen zijn.

    Hoe krijg ik op een "normale" manier een namespace voor het attribute 'id'?

  2. #2
    Counting your refs Paul-Jan's Avatar
    Join Date
    Feb 2002
    Location
    Lage Zwaluwe
    Posts
    2,160
    Zo te zien is volgens de documentatie het tweede argument van setAttributeNS de letterlijke URI van de namespace, niet de alias

    De aanroep zou dan dus worden

    Delphi Code:
    1. ndC.setAttributeNS('id', 'http://www.rtba.nl/rtba0102/4.3.0', '123456')

    Werk dat wél? Voor het net zou ik dan zeker die `http://www.rtba.nl/rtba0102/4.3.0` even in een variabele rgbaNamespace zetten en hergebruiken waar nodig.

  3. #3
    Counting your refs Paul-Jan's Avatar
    Join Date
    Feb 2002
    Location
    Lage Zwaluwe
    Posts
    2,160
    Als je trouwens lievert wil valsspelen (of meer exacte controle wil over de output), grote kans dat dit ook werkt:

    Delphi Code:
    1. ndC.setAttributeNS('rtba:id', '', '123456')

  4. #4
    Senior Member
    Join Date
    Mar 2002
    Location
    Edam
    Posts
    426
    Hi Paul-Jan,

    Dank! Het invullen van de URI ipv. de alias werkt.

    Ik zie nu dat ik een foutje heb gemaakt in de weergave van mijn poging: Niets van wat ik op de plek zet van de namespace heeft effect behalve de URI ook geen foutmelding

    De foutmelding die ik noemde was het gevolg van een poging tot valsspelen door - zoals je voorstelt - de alias zelf voor de naam te zetten.
    Als ik dat doe zonder iets in te vullen op de plek voor de namespace dan volgt de fout "onbekende namespace"
    vul ik wel wat in op die plek ( bestaand of niet bestaand namespace alias) dan volgt de fout "namespace conflict".

    Vreemd effect: als ik jouw vervalsingsmethode gebruik met een niet bestaande alias-prefix en een namespace invul ( of een willekeurige twordt er een extra attribuut toegevoegd en krijgt het id een namespaceprefix

    Delphi Code:
    1. ndC.setAttributeNS('ABCD:id', 'rtba', '123456')

    <rtba:Object xmlns:ABCD="rtba" ABCD:Id="123456">

    geen namespace invullen geeft in deze constructie weer een error "onbekende namespace"

  5. #5
    Counting your refs Paul-Jan's Avatar
    Join Date
    Feb 2002
    Location
    Lage Zwaluwe
    Posts
    2,160
    Fijn dat het werkt!

    Mooi (of jammer?) dat het valsspelen niet (zomaar) werkt, interessant om te weten!

Thread Information

Users Browsing this Thread

There are currently 1 users browsing this thread. (0 members and 1 guests)

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •