e79aa3c0ed
Former-commit-id: a2155e9bd80020e49e72e86c44da02a8ac0e57a4
127 lines
4.3 KiB
C#
127 lines
4.3 KiB
C#
//------------------------------------------------------------------------------
|
|
// <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;
|
|
}
|
|
}
|
|
}
|
|
|