Lite svårt att veta i vilket forum det här egentligen hörde hemma, men i alla fall: Här är ett lite snyggare sätt att lösa det på: <b>eftersom container tydligen innehåller "random" textelement</b> det är sant, men kan jag då lita på att childNodes[1], childNodes[3] och childNodes[5] ALLTID funkar? Dvs implicerar whitespace en och endast en TextNode ? <b>kan jag då lita på att childNodes[1], childNodes[3] och childNodes[5] ALLTID funkar?</b> Varför ska du bry dig om whitespace? <b>Om implementationen är sådan att t.ex. nodes[0] är whitespace (vilket verkar korkat- har aldrig sett en sådan implementation)</b> <b>Yes, exemplet funkar bara med IE, windows vad jag vet, men förutsättningen, som jag fattade var att Ms XmlHttp användes också. Det är väl i princip syntax för plattformsoberoende DomDocuments gissar jag (har inte sysslat med dessa objekt själv).</b> Om du vet vad underelementen heter och element med det namnet inte kan finnas på lägre nivåer, kan du använda getElementsByTagName() på container-elementet: där hade vi det! Var helt övertygad om att även getElementsByTagName hörde hemma endast på dokument objektet, men så var ju inte fallet. PP: Ok det var ju gulligt av Firefox. Men ärligt talat tycker jag att en DOM som ignorerar Whitespace är mer användbar. I verkliga scenarier vill jag plocka ut riktig data från vissa noder. Då är inte whitespace intressant, utan leder ju bara till mer kod, eventuellt. Men det klart: det bästa vore väl om det var valbart och att default var standard enl DOM level 3. Typ en flagga på objektet IgnoreWhitespace true/false. Simon, xpath eller liknande
Har ett xml dokument som ser ut ungefär som följande (samma struktur), som jag laddar med xmlhttp till en html sida.
<root>
<container>
<foo>..</foo>
<bar>..</bar>
<baz>..</baz>
<container>
<container>...</container>
...
</root>
Nu är jag intresserad av foo,bar,baz elementen, grupperade enligt container.
Har dagens browsers stöd för xpath, eller hur gör jag för att vettigt få fram dom
Nu gör jag
document.getElementsByTagName("container");
men sen för att få barnen så måste jag först gå igenom .childNodes, och kolla att .tagName är rätt (eftersom container tydligen innehåller "random" textelement)
och sedan hämta datan jag är intresserad av.
Detta känns dumt, har jag missat nåt, kan man göra det fiffigare?
Sv: xpath eller liknande
<html>
<head>
<script>
function parseXml()
{
var xml;
xml = '<root><container><foo>foo</foo><bar>bar</bar><baz>baz</baz></container><container><bar>bar2</bar></container></root>';
var dom = new ActiveXObject("MSXML2.DOMdocument.3.0");
dom.loadXML(xml);
var nodes = dom.selectNodes("/root/container");
for (n = 0; n < nodes.length; n++)
{
printNode(nodes[n], 'foo');
printNode(nodes[n], 'bar');
printNode(nodes[n], 'baz');
document.all.t1.innerHTML += '<p>';
}
}
function printNode(element,name)
{
var e = element.selectSingleNode(name);
if (e) document.all.t1.innerHTML += e.text + ' | ';
}
</script>
</head>
<body onload="parseXml();">
<div id="t1"></div>
</body>
</html>
Sv: xpath eller liknande
Helt "random" är de inte. I din kod har du radbrytningar och mellanslag/tabbar mellan barnelementen till container:
<container>
<foo>..</foo>
<bar>..</bar>
<baz>..</baz>
<container>
Sv:xpath eller liknande
Sv: xpath eller liknande
Nej, jag vill minnas att det har varit olika mellan olika webbläsare huruvida whitespace skippas eller läggs in som en textnod. Därmed kan det förstås även vara skillnad mellan andra XML-tolkar.Sv:xpath eller liknande
Du är väl intresserad av innehållet i noderna <foo>, <bar> osv?
I mitt exempel funkar alltid nodes[n], ja. Om implementationen är sådan att t.ex. nodes[0] är whitespace (vilket verkar korkat- har aldrig sett en sådan implementation) så kommer nästa SelectSingleNode inte göra något, så det spelar ingen roll.
Yes, exemplet funkar bara med IE, windows vad jag vet, men förutsättningen, som jag fattade var att Ms XmlHttp användes också. Det är väl i princip syntax för plattformsoberoende DomDocuments gissar jag (har inte sysslat med dessa objekt själv).Sv: xpath eller liknande
Orkar inte pröva nu, men jag tror att Firefox kör så.
http://www.w3.org/DOM/faq:
<b>Why are some Text nodes empty?
In XML, all whitespace has to be passed through to the
application. This means that if you have whitespace, such as
carriage returns, between tags in your source file, these have to
be passed through, even if they're just there for pretty-printing.
The DOM implementation has to put this whitespace somewhere, and
the only possibility is a text node. Thus you will get text nodes
which look empty, but in fact have a carriage return or other
whitespace in them.
Note that some DOM implementations, which do not consider
whitespace in element content to be meaningful for the XML
languages they support, discard these whitespace nodes before
exposing the DOM to their users.
See also the parameter "element-content-whitespace" in the
DOMConfiguration interface provided by DOM Level 3.</b>
Som vanligt... IE gör fel, Firefox gör rätt.Sv: xpath eller liknande
förutsättningen var xmlhttp jo MEN inte enbart ms xmlhttp (ActiveX)
http://developer.apple.com/internet/webcontent/xmlhttpreq.html
Så tyvärr, även om nån sorts xpath skulle ha varit bra, så verkar det inte funka i alla browsers..Sv: xpath eller liknande
var containers = document.getElementsByTagName("container");
for(var i = 0; i<containers.length; i++) {
var container = containers[i];
var foo = container.getElementsByTagName("foo"); // <---- hämtar foo-elementet under container
}
Sv:xpath eller liknande
Sv:xpath eller liknande
Sv:xpath eller liknande
Xpath fungerar bra i DOM Level 3 (ska fungera) och i Mozilla/Firefox då.
Dvs mitt exempel bör funka där och med Xpath,
det är bara skapandet av själva objekten XmlHttp, DomDocument, osv som skiljer sig.
I det här fallet är det väl vilket som, men jag brukar alltid köra Xpath uttryck som ger mer flexibilitet.