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
|
//------------------------------------------------------------------------------
// <copyright file="XPathBinder.cs" company="Microsoft">
// Copyright (c) Microsoft Corporation. All rights reserved.
// </copyright>
//------------------------------------------------------------------------------
namespace System.Web.UI {
using System;
using System.Globalization;
using System.Collections;
using System.ComponentModel;
using System.ComponentModel.Design;
using System.Data;
using System.Xml;
using System.Xml.XPath;
/// <devdoc>
/// </devdoc>
public sealed class XPathBinder {
/// <internalonly/>
private XPathBinder() {
}
/// <devdoc>
/// </devdoc>
public static object Eval(object container, string xPath) {
IXmlNamespaceResolver resolver = null;
return Eval(container, xPath, resolver);
}
public static object Eval(object container, string xPath, IXmlNamespaceResolver resolver) {
if (container == null) {
throw new ArgumentNullException("container");
}
if (String.IsNullOrEmpty(xPath)) {
throw new ArgumentNullException("xPath");
}
IXPathNavigable node = container as IXPathNavigable;
if (node == null) {
throw new ArgumentException(SR.GetString(SR.XPathBinder_MustBeIXPathNavigable, container.GetType().FullName));
}
XPathNavigator navigator = node.CreateNavigator();
object retValue = navigator.Evaluate(xPath, resolver);
// If we get back an XPathNodeIterator instead of a simple object, advance
// the iterator to the first node and return the value.
XPathNodeIterator iterator = retValue as XPathNodeIterator;
if (iterator != null) {
if (iterator.MoveNext()) {
retValue = iterator.Current.Value;
}
else {
retValue = null;
}
}
return retValue;
}
/// <devdoc>
/// </devdoc>
public static string Eval(object container, string xPath, string format) {
return Eval(container, xPath, format, null);
}
public static string Eval(object container, string xPath, string format, IXmlNamespaceResolver resolver) {
object value = XPathBinder.Eval(container, xPath, resolver);
if (value == null) {
return String.Empty;
}
else {
if (String.IsNullOrEmpty(format)) {
return value.ToString();
}
else {
return String.Format(format, value);
}
}
}
/// <devdoc>
/// Evaluates an XPath query with respect to a context IXPathNavigable object that returns a NodeSet.
/// </devdoc>
public static IEnumerable Select(object container, string xPath) {
return Select(container, xPath, null);
}
public static IEnumerable Select(object container, string xPath, IXmlNamespaceResolver resolver) {
if (container == null) {
throw new ArgumentNullException("container");
}
if (String.IsNullOrEmpty(xPath)) {
throw new ArgumentNullException("xPath");
}
ArrayList results = new ArrayList();
IXPathNavigable node = container as IXPathNavigable;
if (node == null) {
throw new ArgumentException(SR.GetString(SR.XPathBinder_MustBeIXPathNavigable, container.GetType().FullName));
}
XPathNavigator navigator = node.CreateNavigator();
XPathNodeIterator iterator = navigator.Select(xPath, resolver);
while (iterator.MoveNext()) {
IHasXmlNode hasXmlNode = iterator.Current as IHasXmlNode;
if (hasXmlNode == null) {
throw new InvalidOperationException(SR.GetString(SR.XPathBinder_MustHaveXmlNodes));
}
results.Add(hasXmlNode.GetNode());
}
return results;
}
}
}
|