ASP.NET Tutorial/XML/XPath
Содержание
Querying XML with XPathDocument and XPathNodeIterator (C#)
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>Untitled Page</title>
</head>
<body>
<form id="form1" runat="server">
<div>
</div>
</form>
</body>
</html>
File: Default.aspx.cs
using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.IO;
using System.Xml;
using System.Xml.XPath;
public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
string booksFile = Path.rubine(Request.PhysicalApplicationPath, "Data.xml");
XPathDocument document = new XPathDocument(booksFile);
XPathNavigator nav = document.CreateNavigator();
XmlNamespaceManager namespaceMgr = new XmlNamespaceManager(nav.NameTable);
namespaceMgr.AddNamespace("b", "http://example.books.ru");
foreach (XPathNavigator node in nav.Select("//b:book[not(b:price[. > 10.00])]/b:price",namespaceMgr))
{
Decimal price = (decimal)node.ValueAs(typeof(decimal));
Response.Write(String.Format("Price is {0}<BR/>", price));
}
}
}
File: Data.xml
<?xml version="1.0"?>
<bookstore xmlns="http://example.books.ru"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<book genre="A"
publicationdate="1981"
ISBN="1-11111-11-0">
<title>title 1</title>
<author>
<first-name>A</first-name>
<last-name>B</last-name>
</author>
<price>8</price>
</book>
<book genre="B"
publicationdate="1999"
ISBN="0-222-22222-2">
<title>title 2</title>
<author>
<first-name>C</first-name>
<last-name>D</last-name>
</author>
<price>11.99</price>
</book>
</bookstore>
Querying XML with XPathDocument and XPathNodeIterator (VB)
<%@ Page Language="VB" AutoEventWireup="false" CodeFile="Default.aspx.vb" Inherits="_Default" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>Untitled Page</title>
</head>
<body>
<form id="form1" runat="server">
<div>
</div>
</form>
</body>
</html>
File: Default.aspx.vb
Imports System.IO
Imports System.Xml
Imports System.Xml.XPath
Partial Class _Default
Inherits System.Web.UI.Page
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) _
Handles Me.Load
Dim booksFile As String = Path.rubine(Request.PhysicalApplicationPath, _
"Data.xml")
Dim document As New XPathDocument(booksFile)
Dim nav As XPathNavigator = document.CreateNavigator()
Dim namespaceMgr As New XmlNamespaceManager(nav.NameTable)
namespaceMgr.AddNamespace("b", "http://example.books.ru")
For Each node As XPathNavigator In nav.Select( _
"//b:book[not(b:price[. > 10.00])]/b:price", namespaceMgr)
Dim price As Decimal = _
CType(node.ValueAs(GetType(Decimal)), Decimal)
Response.Write(String.Format("Price is {0}<BR/>", _
price))
Next
End Sub
End Class
File: Data.xml
<?xml version="1.0"?>
<bookstore xmlns="http://example.books.ru"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<book genre="A"
publicationdate="1981"
ISBN="1-11111-11-0">
<title>title 1</title>
<author>
<first-name>A</first-name>
<last-name>B</last-name>
</author>
<price>8</price>
</book>
<book genre="B"
publicationdate="1999"
ISBN="0-222-22222-2">
<title>title 2</title>
<author>
<first-name>C</first-name>
<last-name>D</last-name>
</author>
<price>11.99</price>
</book>
</bookstore>
<%@ Page Language="VB" %>
<%@ Import Namespace="System.Xml" %>
<%@ Import Namespace="System.Xml.XPath" %>
<script runat="server">
sub Page_Load(Sender as object, e as EventArgs)
Dim objReader as New XmlTextReader(Server.MapPath("Data.xml"))
Dim objDoc as XPathDocument = new XPathDocument(objReader)
Dim objNav as XPathNavigator = objDoc.CreateNavigator()
DisplayNode(objNav)
end sub
sub DisplayNode(objNav as XPathNavigator)
If objNav.HasChildren then
objNav.MoveToFirstChild()
Format(objNav)
DisplayNode(objNav)
objNav.MoveToParent()
End If
While objNav.MoveToNext()
Format(objNav)
DisplayNode(objNav)
end While
end sub
Private Sub Format(objNav As XPathNavigator)
If Not objNav.HasChildren then
if objNav.NodeType <> XmlNodeType.Text then
Response.Write("<<b>" & _
objNav.Name & "</b>>")
end if
Response.Write(" - " & objNav.Value & _
"<br>" & vbCrLf)
Else
Dim i As Integer
Response.Write("<<b>" & objNav.Name & _
"</b>>" & vbCrLf)
If objNav.HasAttributes then
Response.Write("<br>Attributes of <" & _
objNav.Name & "><br>" & vbCrLf)
End If
while objNav.MoveToNextAttribute()
Response.Write("<<b>" & objNav.Name & "</b>> " & objNav.Value & " ")
end while
Response.Write("<br>" & vbCrLf)
End If
end sub
</script>
<html><body>
</body></html>
Use XPath to query XML data (VB.net)
<%@ Page Language="VB" %>
<%@ Import Namespace="System.Xml" %>
<%@ Import Namespace="System.Xml.XPath" %>
<script runat="server">
sub SelectData(Sender as Object, e as EventArgs)
Dim objReader as New XmlTextReader(Server.MapPath("Data.xml"))
Dim objDoc as XPathDocument = new XPathDocument(objReader)
Dim objNav as XPathNavigator = objDoc.CreateNavigator()
try
Dim expr as XPathExpression = objNav.rupile(tbQuery.Text)
Dim mngr as XmlNamespaceManager = new XmlNamespaceManager(objReader.NameTable)
mngr.AddNamespace("","x-schema:books.xdr")
expr.SetContext(mngr)
dim objIterator as XPathNodeIterator = objNav.Select(expr)
While objIterator.MoveNext()
Format(objIterator.Current)
end while
catch ex As Exception
Response.Write(ex.Message)
end try
objReader.Close()
end sub
Private Sub Format(objNav As XPathNavigator)
Dim strValue As String
Dim strName As String
If objNav.HasChildren then
strName = objNav.Name
objNav.MoveToFirstChild()
strValue = objNav.Value
Else
strValue = objNav.Value
strName = objNav.Name
End If
Response.Write("<<b>" & strName & _
"</b>>" & strValue & "<br>")
End Sub
</script>
<html><body>
<form runat=server>
<asp:Textbox id="tbQuery" runat=server/>
<asp:Button id="btnSubmit" text="Submit"
runat=server OnClick="SelectData"/><BR>
</form>
</body></html>
File: Data.xml
<?xml version="1.0"?>
<bookstore>
<book genre="asdf">
<title>asdf</title>
<author>
<first-name>asdf</first-name>
<last-name>asdf</last-name>
</author>
<price>asdf</price>
</book>
<book genre="asdf">
<title>asdf</title>
<author>
<first-name>asdf</first-name>
<last-name>asdf</last-name>
</author>
<price>asdf</price>
</book>
<book genre="asdf">
<title>asdf</title>
<author>
<first-name>asdf</first-name>
<last-name>asdf</last-name>
</author>
<price>asdf</price>
</book>
</bookstore>
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="XPathNavigatorRead" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>Untitled Page</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:Literal id="XmlText" runat="server"></asp:Literal>
</div>
</form>
</body>
</html>
File: Default.aspx.cs
using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Xml;
using System.Xml.XPath;
using System.Text;
public partial class XPathNavigatorRead : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
string xmlFile = Server.MapPath("Data.xml");
XmlDocument doc = new XmlDocument();
doc.Load(xmlFile);
XPathNavigator xnav = doc.CreateNavigator();
XmlText.Text = GetXNavDescr(xnav, 0);
}
private string GetXNavDescr(XPathNavigator xnav, int level)
{
string indent = "";
for (int i = 0; i < level; i++)
indent += " ";
StringBuilder str = new StringBuilder("");
switch (xnav.NodeType)
{
case XPathNodeType.Root:
str.Append("<b>ROOT</b>");
str.Append("<br>");
break;
case XPathNodeType.Element:
str.Append(indent);
str.Append("Element: <b>");
str.Append(xnav.Name);
str.Append("</b><br>");
break;
case XPathNodeType.Text:
str.Append(indent);
str.Append(" - Value: <b>");
str.Append(xnav.Value);
str.Append("</b><br>");
break;
case XPathNodeType.rument:
str.Append(indent);
str.Append("Comment: <b>");
str.Append(xnav.Value);
str.Append("</b><br>");
break;
}
if (xnav.HasAttributes)
{
xnav.MoveToFirstAttribute();
do
{
str.Append(indent);
str.Append(" - Attribute: <b>");
str.Append(xnav.Name);
str.Append("</b> Value: <b>");
str.Append(xnav.Value);
str.Append("</b><br>");
} while (xnav.MoveToNextAttribute());
xnav.MoveToParent();
}
if (xnav.HasChildren)
{
xnav.MoveToFirstChild();
do
{
str.Append(GetXNavDescr(xnav, level + 1));
} while (xnav.MoveToNext());
xnav.MoveToParent();
}
return str.ToString();
}
}
File: Data.xml
<?xml version="1.0"?>
<DvdList>
<DVD ID="1" Category="Category 1">
<Title>title 1</Title>
<Director>directory 2</Director>
<Price>1</Price>
<Starring>
<Star>star 1</Star>
<Star>star 2</Star>
</Starring>
</DVD>
<DVD ID="2" Category="Category 2">
<Title>title 2</Title>
<Director>directory 2</Director>
<Price>2</Price>
<Starring>
<Star>star 3</Star>
<Star>star 4</Star>
</Starring>
</DVD>
</DvdList>
XPath Search
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="XPathSearch" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>Untitled Page</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:Literal id="XmlText" runat="server"></asp:Literal>
</div>
</form>
</body>
</html>
File: Default.aspx.cs
using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Xml;
using System.Text;
public partial class XPathSearch : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
string xmlFile = Server.MapPath("Data.xml");
XmlDocument doc = new XmlDocument();
doc.Load(xmlFile);
XmlNodeList nodes = doc.SelectNodes("/DvdList/DVD/Title[../@Category="Category 1"]");
StringBuilder str = new StringBuilder();
foreach (XmlNode node in nodes)
{
str.Append("Found: <b>");
str.Append(node.ChildNodes[0].Value);
str.Append("</b><br>");
}
XmlText.Text = str.ToString();
}
}
File: Data.xml
<?xml version="1.0"?>
<DvdList>
<DVD ID="1" Category="Category 1">
<Title>title 1</Title>
<Director>directory 2</Director>
<Price>1</Price>
<Starring>
<Star>star 1</Star>
<Star>star 2</Star>
</Starring>
</DVD>
<DVD ID="2" Category="Category 2">
<Title>title 2</Title>
<Director>directory 2</Director>
<Price>2</Price>
<Starring>
<Star>star 3</Star>
<Star>star 4</Star>
</Starring>
</DVD>
</DvdList>