My favorites
▼
|
Sign in
totoe
JSON and XML parser for GWT with json/xpath and namespace support
Project Home
Downloads
Wiki
Issues
Source
READ-ONLY: This project has been
archived
. For more information see
this post
.
Search
Search within:
All issues
Open issues
New issues
Issues to verify
for
Advanced search
Search tips
Subscriptions
Issue
3
attachment: XmlParserImpl.java
(5.3 KB)
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
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
package name.pehl.totoe.xml.client.internal;
import name.pehl.totoe.xml.client.Document;
import name.pehl.totoe.xml.client.XmlParseException;
import com.google.gwt.core.client.JavaScriptException;
import com.google.gwt.core.client.JavaScriptObject;
/**
* @author $Author: harald.pehl $
* @version $Date: 2010-10-26 06:04:16 -0600 (Tue, 26 Oct 2010) $ $Revision: 629
* $
*/
public class XmlParserImpl
{
// ------------------------------------------------------------------- JSNI
private static final JavaScriptObject nativeParser = XmlParserImpl.initialize();
private static JavaScriptObject initialize() {
setupSarissaPrototypes();
return initializeDOMParser();
}
public static native void setupSarissaPrototypes() /*-{
if($wnd.Sarissa._SARISSA_HAS_DOM_FEATURE && document.implementation.hasFeature("XPath", "3.0")){
XMLDocument.prototype._sarissa_useCustomResolver = false;
XMLDocument.prototype._sarissa_xpathNamespaces = [];
XMLDocument.prototype.selectNodes = function(sExpr, contextNode, returnSingle){
var nsDoc = this;
var nsresolver;
if(this._sarissa_useCustomResolver){
nsresolver = function(prefix){
var s = nsDoc._sarissa_xpathNamespaces[prefix];
if(s){
return s;
}
else {
throw "No namespace URI found for prefix: '" + prefix+"'";
}
};
}
else{
nsresolver = this.createNSResolver(this.documentElement);
}
var result = null;
if(!returnSingle){
var oResult = this.evaluate(sExpr,
(contextNode?contextNode:this),
nsresolver,
XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
var nodeList = new SarissaNodeList(oResult.snapshotLength);
nodeList.expr = sExpr;
for(var i=0;i<nodeList.length;i++){
nodeList[i] = oResult.snapshotItem(i);
}
result = nodeList;
}
else {
result = this.evaluate(sExpr,
(contextNode?contextNode:this),
nsresolver,
XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue;
}
return result;
};
Element.prototype.selectNodes = function(sExpr){
var doc = this.ownerDocument;
if(doc.selectNodes){
return doc.selectNodes(sExpr, this);
}
else{
throw "Method selectNodes is only supported by XML Elements";
}
};
XMLDocument.prototype.selectSingleNode = function(sExpr, contextNode){
var ctx = contextNode?contextNode:null;
return this.selectNodes(sExpr, ctx, true);
};
Element.prototype.selectSingleNode = function(sExpr){
var doc = this.ownerDocument;
if(doc.selectSingleNode){
return doc.selectSingleNode(sExpr, this);
}
else{
throw "Method selectNodes is only supported by XML Elements";
}
};
}
}-*/;
private static native JavaScriptObject initializeDOMParser() /*-{
return new $wnd.DOMParser();
}-*/;
// ---------------------------------------------------------- parse methods
public Document parse(String xml, String namespaces)
{
if (xml == null || xml.trim().length() == 0)
{
return null;
}
try
{
JavaScriptObject documentJso = parseImpl(xml, namespaces);
return NodeFactory.create(documentJso);
}
catch (JavaScriptException e)
{
throw new XmlParseException(e.getMessage(), e);
}
}
private native JavaScriptObject parseImpl(String xml, String namespaces) /*-{
var domDoc = @name.pehl.totoe.xml.client.internal.XmlParserImpl::nativeParser.parseFromString(xml, "text/xml");
var error = $wnd.Sarissa.getParseErrorText(domDoc);
if (error != $wnd.Sarissa.PARSED_OK)
{
if (error == $wnd.Sarissa.PARSED_EMPTY)
{
return null;
}
else if (error == $wnd.Sarissa.PARSED_UNKNOWN_ERROR)
{
throw (new Error("Unkown error parsing xml file."));
}
else
{
throw (new Error(error));
}
return null;
}
if (namespaces != null)
{
try
{
$wnd.Sarissa.setXpathNamespaces(domDoc, namespaces);
}
catch (e)
{
throw (new Error(e));
}
}
return domDoc;
}-*/;
}
Powered by
Google Project Hosting