Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

[.NET] Voegt overal xmlns attributen toe

Pagina: 1
Acties:
  • 221 views sinds 30-01-2008
  • Reageer

  • _Thanatos_
  • Registratie: Januari 2001
  • Laatst online: 27-11 10:50

_Thanatos_

Ja, en kaal

Topicstarter
Ik heb een tool die het nodig vindt om door een XML document heen te wandelen. Iedere node wordt nader bekeken en geinspecteerd. Nu probeer ik voor de gein een XHTML document in te lezen, want dat moet per slot van rekening net zo goed werken. Wat blijkt, het kreng gaat overal allerlei xmlns attributen toe lopen voegen! Voorbeeldje:
XML:
1
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="nl">

Wordt:
XML:
1
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="nl" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="-//W3C//DTD XHTML 1.1//EN">

Gewoon simpelweg door door alle nodes heen te wandelen, krijg ik dit soort taferelen. Die extra attributen zitten dan écht in de Attributes properties. En het ergste is dat ALLE element-nodes dit euvel vertonen.

Nóg erger is dat een Xpath expressies (hierdoor?) niet meer werken.

Moet ik dit aan MS gaan melden, of is hier in de tussentijd een workaround voor?

//edit
Ik zie net dat dit niet het enige is... ik kan de XML ook zo inladen:
C#:
1
2
3
4
5
XmlTextReader reader = new XmlTextReader(stream);
reader.EntityHandling = EntityHandling.ExpandCharEntities;
reader.ProhibitDtd = false;
XmlDocument doc = new XmlDocument();
doc.Load(reader);


Dan zijn die vrvelende namespaces verdwenen. Yay. Maar nu resten nog steeds twee problemen:
  1. De DTD wordt van w3c.org geladen. Kan ik voorkomen door reader.XmlResolver op null te zetten, maar dan gaat ie zeuren over ongedeclareerde entities. De vraag verandert dan dus in hoe zorg ik dat ie ze negeert en gewoon weergeeft als tekst?
  2. In de reader zit de property EntityHandling. Daarmee kun je entities "expanden" naar hun bijbehorende karakter. Dat is wel het láátste wat ik wil (zie punt 1). Maar ik kan alleen kiezen tussen het expanden van alleen character-entities (bijv & #39; (zucht, zelfs dit forum expand ze, vandaar de spatie)) en het expanden van alle entities. Maar de derde mogelijkheid (helemaal niet expanden) is er niet. Daarbij hoort dus de vraag hoe geen enkele entity expanden?
Ik zie het meeste heil in een antwoord op de vraag in puntje 1 ;)

[ Voor 38% gewijzigd door _Thanatos_ op 16-10-2007 04:22 ]

日本!🎌


  • MTWZZ
  • Registratie: Mei 2000
  • Laatst online: 13-08-2021

MTWZZ

One life, live it!

Hoe ziet jouw xhtml er dan uit? Als ik namelijk van mijn site (klik) een dumpje maak dan gebeurt er niet veel raars.
Code als volgt:
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
static void Main(string[] args)
{
    XmlDocument doc = new XmlDocument();

    try
    {
        doc.Load(@"c:\test\got\barad-dur.xhtml");
    }
    catch (XmlException xe)
    {
        Console.WriteLine("XML Error on line: {0} position: {1}\r\n{2}", xe.LineNumber, xe.LinePosition, xe.Message);
        return;
    }

    XmlNode root = doc.DocumentElement.ChildNodes[1];

    DumpNode(root, 0);

    Console.WriteLine("Finished. Press enter");
    Console.ReadLine();
}

private static void DumpNode(XmlNode node, int recurseCounter)
{
    if (recurseCounter > 5)
    {
        return;
    }

    foreach (XmlNode child in node.ChildNodes)
    {
        Console.WriteLine("Node: {0} of type {1}", child.Name, child.NodeType.ToString());
        Console.WriteLine("\tAttributes: ");
        if (child.Attributes != null)
        {
            foreach (XmlAttribute attrib in child.Attributes)
            {
                Console.WriteLine("\t\t\t{0} => {1}", attrib.Name, attrib.Value);
            }
        }

        if (child.HasChildNodes)
        {
            DumpNode(child, ++recurseCounter);
        }
    }
}

Nu met Land Rover Series 3 en Defender 90


  • Niemand_Anders
  • Registratie: Juli 2006
  • Laatst online: 09-07-2024

Niemand_Anders

Dat was ik niet..

xhtml is een dialect gedefinineerd in XML. XML behoort juist de entities te resolven. En het is logisch dat & #235; wordt geresolved. Waarom zou je je afvragen? XML wordt normaal gesproken ingeladen om bewerkt of geqeuried te worden. Stel in wil de titels van alle hyperlinks. Dan voer ik de xpath '//a' uit. Stel nou dat dat het een landenlijst betreft. Zonder de entity resolvement zou belgië als belgi& #235; terug komen. Maar er is een vrij simpele oplossing om te voorkomen dat entities worden geresolved, en dat is gewoon entities niet gebruiken (encoding attribute in xml declaratie).

Er worden steeds meer en meer websites in asp.net geschreven. Het XML component wordt al al jaren gebruikt (sinds 1998 bestaat deze al) en is waarschijnlijk het meest gebruikte XML component ter wereld.

Waarom denken mensen altijd dat als iets niet werkt, dan het dan maar aan het framework ligt? Waarom bedenkt vrijwel niemand zich, doe ik misschien iets fout? Ik heb een beetje het idee dat je zonder enige kennis van XML aan het programmeren bent geslagen en nu het niet lukt, maar andere de schuld geeft. Ik adviseer je eerst maar eens de XML documentatie op W3C te gaan lezen. Dan begrijp je beter hoe XML werkt en waarom betaalde zaken zo zijn (zoals entity resolvement).

If it isn't broken, fix it until it is..


  • _Thanatos_
  • Registratie: Januari 2001
  • Laatst online: 27-11 10:50

_Thanatos_

Ja, en kaal

Topicstarter
Ik heb een beetje het idee dat je zonder enige kennis van XML aan het programmeren bent geslagen en nu het niet lukt, maar andere de schuld geeft.
Gevaarlijk om zoiets te zeggen. Ik heb al talloze projecten met XML mogen doen en geen van allen had toevallig met XHTML te maken. Nu hebben we het over een tool die ieder soort XML moet kunnen parsen, dus óók XHTML. Wat mij daarin opvalt is (1) dat het framework zonder mijn toestemming de DTD helemaal gaat downloaden en (2) het ding de entities wil resolven. En dus soms (3) allerlei nutteloze namespace-attributen toevoegt en daardoor het document invalideert en XPath nutteloos rendert. Ik wil gewoon weten wat er in de XML staat, niet wat het framework er van denkt te maken.

Tuurlijk zal het allemaal wel keurignetjes volgens de standaarden zijn, maar het is óók volgens de standaarden om entities te gebruiken in een XHTML document. Maar om dan de hele parser te laten struikelen omdat hij een entity niet kan vinden, wat weer het gevolg is van dat ik hem de DTD niet wil laten downloaden, gaat me een beetje te ver.

Ok, dus nog eens op een rijtje wat ik wil:
1) Een XML document inladen, zonder resolvers validators en downloads.
2) Alles in het document laten voor wat het is. Dus entities moeten entities blijven.

In any case, discussiëren helpt me niet naar een oplossing. Weet iemand een oplossing?

[ Voor 4% gewijzigd door _Thanatos_ op 16-10-2007 20:16 ]

日本!🎌