Mercurial > pub > ImplabNet
comparison Implab/Xml/JsonXmlReader.cs @ 236:302ca905c19e v2
JsonReader optimizations
author | cin |
---|---|
date | Tue, 21 Nov 2017 14:57:58 +0300 |
parents | 5f7a3e1d32b9 |
children | 7c7e9ad6fe4a |
comparison
equal
deleted
inserted
replaced
235:b49969a7043c | 236:302ca905c19e |
---|---|
37 XmlQualifiedName m_qName; | 37 XmlQualifiedName m_qName; |
38 string m_prefix; | 38 string m_prefix; |
39 int m_xmlDepth; | 39 int m_xmlDepth; |
40 | 40 |
41 XmlSimpleAttribute[] m_attributes; | 41 XmlSimpleAttribute[] m_attributes; |
42 object m_value; | 42 string m_value; |
43 bool m_isEmpty; | 43 bool m_isEmpty; |
44 | 44 |
45 XmlNodeType m_nodeType = XmlNodeType.None; | 45 XmlNodeType m_nodeType = XmlNodeType.None; |
46 | 46 |
47 bool m_isAttribute; // indicates that we are reading attribute nodes | 47 bool m_isAttribute; // indicates that we are reading attribute nodes |
156 } | 156 } |
157 } | 157 } |
158 | 158 |
159 public override string Value { | 159 public override string Value { |
160 get { | 160 get { |
161 return ConvertValueToString(m_value); | 161 return m_value; |
162 } | 162 } |
163 } | 163 } |
164 | 164 |
165 static string ConvertValueToString(object value) { | |
166 if (value == null) | |
167 return string.Empty; | |
168 | |
169 switch (Convert.GetTypeCode(value)) { | |
170 case TypeCode.Double: | |
171 return ((double)value).ToString(CultureInfo.InvariantCulture); | |
172 case TypeCode.String: | |
173 return (string)value; | |
174 case TypeCode.Boolean: | |
175 return (bool)value ? "true" : "false"; | |
176 default: | |
177 return value.ToString(); | |
178 } | |
179 } | |
180 | |
181 public override string GetAttribute(int i) { | 165 public override string GetAttribute(int i) { |
182 Safe.ArgumentInRange(i, 0, AttributeCount - 1, nameof(i)); | 166 Safe.ArgumentInRange(i, 0, AttributeCount - 1, nameof(i)); |
183 return ConvertValueToString(m_attributes[i].Value); | 167 return m_attributes[i].Value; |
184 } | 168 } |
185 | 169 |
186 public override string GetAttribute(string name) { | 170 public override string GetAttribute(string name) { |
187 if (m_attributes == null) | 171 if (m_attributes == null) |
188 return null; | 172 return null; |
189 var qName = m_context.Resolve(name); | 173 var qName = m_context.Resolve(name); |
190 var attr = Array.Find(m_attributes, x => x.QName == qName); | 174 var attr = Array.Find(m_attributes, x => x.QName == qName); |
191 var value = ConvertValueToString(attr?.Value); | 175 var value = attr?.Value; |
192 return value == string.Empty ? null : value; | 176 return value == string.Empty ? null : value; |
193 } | 177 } |
194 | 178 |
195 public override string GetAttribute(string name, string namespaceURI) { | 179 public override string GetAttribute(string name, string namespaceURI) { |
196 if (m_attributes == null) | 180 if (m_attributes == null) |
197 return null; | 181 return null; |
198 var qName = new XmlQualifiedName(name, namespaceURI); | 182 var qName = new XmlQualifiedName(name, namespaceURI); |
199 var attr = Array.Find(m_attributes, x => x.QName == qName); | 183 var attr = Array.Find(m_attributes, x => x.QName == qName); |
200 var value = ConvertValueToString(attr?.Value); | 184 var value = attr?.Value; |
201 return value == string.Empty ? null : value; | 185 return value == string.Empty ? null : value; |
202 } | 186 } |
203 | 187 |
204 public override string LookupNamespace(string prefix) { | 188 public override string LookupNamespace(string prefix) { |
205 return m_context.ResolvePrefix(prefix); | 189 return m_context.ResolvePrefix(prefix); |
317 default: | 301 default: |
318 return true; | 302 return true; |
319 } | 303 } |
320 } | 304 } |
321 | 305 |
322 void ValueNode(object value) { | 306 void ValueNode(string value) { |
323 if (!IsSibling()) // the node is nested | 307 if (!IsSibling()) // the node is nested |
324 m_xmlDepth++; | 308 m_xmlDepth++; |
325 | 309 |
326 m_qName = XmlQualifiedName.Empty; | 310 m_qName = XmlQualifiedName.Empty; |
327 m_nodeType = XmlNodeType.Text; | 311 m_nodeType = XmlNodeType.Text; |
342 if (attrs != null) { | 326 if (attrs != null) { |
343 foreach (var attr in attrs) { | 327 foreach (var attr in attrs) { |
344 if (attr.QName.Name == "xmlns") { | 328 if (attr.QName.Name == "xmlns") { |
345 if (context == m_context) | 329 if (context == m_context) |
346 context = new XmlNameContext(m_context, m_xmlDepth); | 330 context = new XmlNameContext(m_context, m_xmlDepth); |
347 context.DefinePrefix(ConvertValueToString(attr.Value), string.Empty); | 331 context.DefinePrefix(attr.Value, string.Empty); |
348 } else if (attr.Prefix == m_xmlnsPrefix) { | 332 } else if (attr.Prefix == m_xmlnsPrefix) { |
349 if (context == m_context) | 333 if (context == m_context) |
350 context = new XmlNameContext(m_context, m_xmlDepth); | 334 context = new XmlNameContext(m_context, m_xmlDepth); |
351 context.DefinePrefix(ConvertValueToString(attr.Value), attr.QName.Name); | 335 context.DefinePrefix(attr.Value, attr.QName.Name); |
352 } else { | 336 } else { |
353 string attrPrefix; | 337 string attrPrefix; |
354 if (string.IsNullOrEmpty(attr.QName.Namespace)) | 338 if (string.IsNullOrEmpty(attr.QName.Namespace)) |
355 continue; | 339 continue; |
356 | 340 |
514 // generate empty element with xsi:nil="true" attribute | 498 // generate empty element with xsi:nil="true" attribute |
515 ElementNode( | 499 ElementNode( |
516 m_jsonValueName, | 500 m_jsonValueName, |
517 m_jsonNamespace, | 501 m_jsonNamespace, |
518 new[] { | 502 new[] { |
519 new XmlSimpleAttribute("nil", m_xsiNamespace, m_xsiPrefix, true) | 503 new XmlSimpleAttribute("nil", m_xsiNamespace, m_xsiPrefix, "true") |
520 }, | 504 }, |
521 true | 505 true |
522 ); | 506 ); |
523 else | 507 else |
524 ElementNode(m_jsonValueName, m_jsonNamespace, elementAttrs, m_parser.ElementValue.Equals(string.Empty)); | 508 ElementNode(m_jsonValueName, m_jsonNamespace, elementAttrs, m_parser.ElementValue.Equals(string.Empty)); |
605 } | 589 } |
606 | 590 |
607 public override string ToString() { | 591 public override string ToString() { |
608 switch (NodeType) { | 592 switch (NodeType) { |
609 case XmlNodeType.Element: | 593 case XmlNodeType.Element: |
610 return $"<{Name} {string.Join(" ", (m_attributes ?? new XmlSimpleAttribute[0]).Select(x => $"{x.Prefix}{(string.IsNullOrEmpty(x.Prefix) ? "" : ":")}{x.QName.Name}='{ConvertValueToString(x.Value)}'"))} {(IsEmptyElement ? "/" : "")}>"; | 594 return $"<{Name} {string.Join(" ", (m_attributes ?? new XmlSimpleAttribute[0]).Select(x => $"{x.Prefix}{(string.IsNullOrEmpty(x.Prefix) ? "" : ":")}{x.QName.Name}='{x.Value}'"))} {(IsEmptyElement ? "/" : "")}>"; |
611 case XmlNodeType.Attribute: | 595 case XmlNodeType.Attribute: |
612 return $"@{Name}"; | 596 return $"@{Name}"; |
613 case XmlNodeType.Text: | 597 case XmlNodeType.Text: |
614 return $"{Value}"; | 598 return $"{Value}"; |
615 case XmlNodeType.CDATA: | 599 case XmlNodeType.CDATA: |