Verständnisfrage zu Nodes
Dexter
- xml
0 Thomas J.S.0 Dexter
0 Frank (no reg)0 Dexter
Hallo,
ich habe nun zu meinem Problem zu meinem Beitrag "Brauche Hilfe für Summenfunktion bei xsl" weiter unten im XSL Bereich eine Lösung gefunden. Nur habe ich eine Verständnisfrage, wie DOM Nodes speziell Childnodes interpretiert.
Folgender Sachverhalt:
<root>
<produkt1 schalter="003" set="test">13263</produkt1>
<produkt2 schalter="003" set="test">3284623</produkt1>
<!-- kommentar -->
<produkt3 schalter="002" set="test">1231231</produkt1>
<produkt1 schalter="001" set="test">236486</produkt1>
</root>
Ich setze/schreibe nun per ASP das Attribut "set" mit einem bestimmten Wert, der abhängig von dem Attribut "schalter" ist. die asp steht unten, mir geht es aber eher nur um die eine Schleife, die dafür sorgt, dass alle produkte durchsucht werden:
For Each objField In objRoot.childNodes
If objField.getAttribute ("schalter") = Request.Form.Key(x) Then
objField.setAttribute "set", Request.Form(x)
End If
Next
Diese Schleife funktioniert nicht, wenn ich in der XML einen Kommentar habe wie oben gezeigt. Wenn ich aber alle Kommentare aus der xml entfern, dann funktioniert die Schleife. Nun möchte ich aber gerne nicht auf die Kommentare verzichten, da diese schon sehr hilfreich sind. Kann mir das einer erklären??
hier die komplette asp und ersichtlich, dass ich als microsoft dom benutze.
<%
Function loadXMLFile(strXMLFile, strXSLFile)
Dim objXML
Dim objXSL
set objXML = Server.CreateObject("Microsoft.XMLDOM")
objXML.async = false
objXML.load(strXMLFile)
set objXSL = Server.CreateObject("Microsoft.XMLDOM")
objXSL.async = false
objXSL.load(strXSLFile)
Response.Write(objXML.transformNode(objXSL))
End Function
Function updateXML(strXMLFile)
Dim objDom
Dim objRoot
Dim objField
Dim child
Dim x
set objDOM = Server.CreateObject("Microsoft.XMLDOM")
objDOM.async = false
objDOM.load strXMLFile
Set objRoot = objDom.documentElement
For x = 1 to Request.Form.Count
If instr(1,Request.Form.Key(x),"btn") = 0 Then
For Each objField In objRoot.childNodes
If objField.getAttribute ("schalter") = Request.Form.Key(x) Then
objField.setAttribute "set", Request.Form(x)
End If
Next
End If
Next
objDom.save strXMLFile
Set objDom = Nothing
Set objRoot = Nothing
Set objField = Nothing
loadXMLFile strXMLFile,server.MapPath("produkt.xsl")
End Function
If Request.Form("btnSubmit") = "" Then
loadXMLFile server.MapPath("produkt.xml"), _
server.MapPath("produkt.xsl")
Else
updateXML server.MapPath("produkt.xml")
End If
%>
Hallo,
ich habe nun zu meinem Problem zu meinem Beitrag "Brauche Hilfe für Summenfunktion bei xsl" weiter unten im XSL Bereich eine Lösung gefunden. Nur habe ich eine Verständnisfrage, wie DOM Nodes speziell Childnodes interpretiert.
For Each objField In objRoot.childNodes
If objField.getAttribute ("schalter") = Request.Form.Key(x) Then
objField.setAttribute "set", Request.Form(x)
End If
NextDiese Schleife funktioniert nicht, wenn ich in der XML einen Kommentar habe wie oben gezeigt. Wenn ich aber alle Kommentare aus der xml entfern, dann funktioniert die Schleife. Nun möchte ich aber gerne nicht auf die Kommentare verzichten, da diese schon sehr hilfreich sind. Kann mir das einer erklären??
root = element node --> enthält als child node:
produkt* = element node
kommentar = comment node
Du kannst oder musst in dem Fall auch auf nodeType (8 ist comment_node) prüfen:
http://www.w3.org/TR/1998/REC-DOM-Level-1-19981001/level-one-core.html#ID-1950641247
oder http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/core.html#ID-1950641247
Grüße
Thomas
Hallo Thomas,
erst einmal vielen Dank für deine Antwort. Da hat sich jetzt aber wieder fuer mich ein weiteres Tor geöffnet ;-) Aber so richtig weiss ich jetzt nicht, wie ich das in meine Schleife einbinden kann. Wie kann ich die Schleife nur auf element_node also 1 beziehen, so dass er die Attribute nur bei diesen überprüft und das Attribut setzt?
Vielleicht hast Du ja eine schnelle Lösung bei der Hand, trotzdem danke für deine bisherige Hilfe.
Hallo,
ich habe nun zu meinem Problem zu meinem Beitrag "Brauche Hilfe für Summenfunktion bei xsl" weiter unten im XSL Bereich eine Lösung gefunden. Nur habe ich eine Verständnisfrage, wie DOM Nodes speziell Childnodes interpretiert.
For Each objField In objRoot.childNodes
If objField.getAttribute ("schalter") = Request.Form.Key(x) Then
objField.setAttribute "set", Request.Form(x)
End If
NextDiese Schleife funktioniert nicht, wenn ich in der XML einen Kommentar habe wie oben gezeigt. Wenn ich aber alle Kommentare aus der xml entfern, dann funktioniert die Schleife. Nun möchte ich aber gerne nicht auf die Kommentare verzichten, da diese schon sehr hilfreich sind. Kann mir das einer erklären??
root = element node --> enthält als child node:
produkt* = element node
kommentar = comment nodeDu kannst oder musst in dem Fall auch auf nodeType (8 ist comment_node) prüfen:
http://www.w3.org/TR/1998/REC-DOM-Level-1-19981001/level-one-core.html#ID-1950641247
oder http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/core.html#ID-1950641247Grüße
Thomas
Hallo,
erst einmal vielen Dank für deine Antwort. Da hat sich jetzt aber wieder fuer mich ein weiteres Tor geöffnet ;-) Aber so richtig weiss ich jetzt nicht, wie ich das in meine Schleife einbinden kann. Wie kann ich die Schleife nur auf element_node also 1 beziehen, so dass er die Attribute nur bei diesen überprüft und das Attribut setzt?
Vielleicht hast Du ja eine schnelle Lösung bei der Hand, trotzdem danke für deine bisherige Hilfe.
For Each objField In objRoot.childNodes
If objField.getAttribute ("schalter") = Request.Form.Key(x) Then
objField.setAttribute "set", Request.Form(x)
End If
Next
In ASP nicht, aber in JavaScript so in etwa (nur sehr schematsich, aber ich denke, du wirst das für dich adaptieren können):
var Obj = document.getElementById("root");
for (i=0; i<Obj.childNodes.length; i++)
{
elementNode = Obj.childNodes[i];
if(elementNode.nodeType == 1)
{
....
}
}
Grüße
Thomas
Hi,
ein alternativer Ansatz zu Thomas' seinem, wäre, per XPath grundsätzlich
nur alle Nodes mit dem Namen "produkt" vom Typ "element node" zu erfassen
und dann in einer fast identischen Schleife zu durchlaufen.
Ein Tipp noch zum Thema Inkompatibilitäten der MSXML Parserversionen.
Deine ProgId kann auf der Entwicklungs-Maschine auf eine bestimmte
MSXML Version verweisen, während auf dem Produktivsystem es auf eine
andere Version verweist. Dadurch können später schwer vorhersehbare und
aufspürbare Fehler auftreten.
Es gibt für die DOM Implementierung auch Versionsspezifische ProgIds wie
z.b. Microsoft.XmlDomDocument.4.0
die ich für geeigneter in deinem Fall halte.
Ciao, Frank
Uh, da wirfst du mir aber jetzt mächtiges Fachchinesisch vor ;-) Ich werde mal einen Fachmann über meinen Code blicken lassen und hoffe der findet dann all die Vebesserungen. Das mit den nur auf produkt zu beschränken geht leider nicht, da es auch andere Bezeichnungen gibt. Aber trotzdem danke für den Hinweis. Wieder etwas schlauer.
Hi,
ein alternativer Ansatz zu Thomas' seinem, wäre, per XPath grundsätzlich
nur alle Nodes mit dem Namen "produkt" vom Typ "element node" zu erfassen
und dann in einer fast identischen Schleife zu durchlaufen.Ein Tipp noch zum Thema Inkompatibilitäten der MSXML Parserversionen.
Deine ProgId kann auf der Entwicklungs-Maschine auf eine bestimmte
MSXML Version verweisen, während auf dem Produktivsystem es auf eine
andere Version verweist. Dadurch können später schwer vorhersehbare und
aufspürbare Fehler auftreten.Es gibt für die DOM Implementierung auch Versionsspezifische ProgIds wie
z.b. Microsoft.XmlDomDocument.4.0
die ich für geeigneter in deinem Fall halte.Ciao, Frank