ASP.Net/XML/XPath
Содержание
- 1 Finding a Particular Node in an XML Document?
- 2 Finding a Particular Node in an XML Document (VB)
- 3 Use XML Path to locate Node and edit its value
- 4 Use XPathNavigator to create attribute
- 5 Use XPath to read XML document
- 6 Using the XPathNavigator for Navigating Xml Documents
- 7 XPathNavigator Selection Example
Finding a Particular Node in an XML Document?
<%@ Page language="c#" AutoEventWireup="true" %>
<%@ Import Namespace="System.Data" %>
<script language="C#" runat="server">
protected System.Xml.XmlDocument xmlSource = new System.Xml.XmlDocument();
private void LoadButton_Click(object sender, System.EventArgs e)
{
System.IO.Stream xmlDocStream = GetXmlDoc(XmlSourceTextBox.Text);
if(xmlDocStream!=null) {
xmlSource.Load(xmlDocStream);
ResultText.Text=xmlSource.InnerXml;
}
else
{
ResultText.Text="Could not resolve the XML document.";
}
}
public static System.IO.Stream GetXmlDoc(string xmlsource) {
System.IO.Stream stream=null;
if(xmlsource.StartsWith("<?xml") || xmlsource.StartsWith("<schema") )
{
stream = new System.IO.MemoryStream(System.Text.ASCIIEncoding.ASCII.GetBytes(xmlsource));
}
else
{
try
{
System.Uri xmluri = new System.Uri(xmlsource);
if(xmluri.IsFile) {
stream = new System.IO.FileStream(xmlsource, System.IO.FileMode.Open);
} else {
System.Net.HttpWebRequest request = (System.Net.HttpWebRequest) System.Net.WebRequest.Create(xmluri);
System.Net.WebResponse response = request.GetResponse();
stream = response.GetResponseStream();
}
}
catch(Exception e)
{
}
}
return stream;
}
private void QueryButton_Click(object sender, System.EventArgs e)
{
System.Text.StringBuilder s = new System.Text.StringBuilder();
if(xmlSource==null || xmlSource.InnerText=="") xmlSource.LoadXml(ResultText.Text);
try
{
System.Xml.XmlNodeList nl = xmlSource.SelectNodes(XPathText.Text);
int counter=1;
foreach(System.Xml.XmlNode node in nl)
{
s.Append(counter + "]" + node.InnerText + System.Environment.NewLine);
counter++;
}
QueryResult.Text=s.ToString();
}
catch(Exception selectNodesError)
{
QueryResult.Text=selectNodesError.ToString();
}
}
</script>
<HTML>
<HEAD>
<title>Finding a Particular Node in an XML Document</title>
</HEAD>
<body>
<form id="Form1" method="post" runat="server">
<asp:textbox id="XmlSourceTextBox" runat="server" Width="379px" Height="162px" TextMode="MultiLine"></asp:textbox><br/>
<asp:button id="LoadButton" runat="server" Text="Load XML Document" OnClick="LoadButton_Click"></asp:button><br/>
<asp:TextBox id="ResultText" runat="server" Width="379px" Height="194px" TextMode="MultiLine"></asp:TextBox><br/>
<asp:Button id="QueryButton" runat="server" Text="Query" OnClick="QueryButton_Click"></asp:Button><br/>
<asp:TextBox id="XPathText" runat="server" Width="379px"></asp:TextBox><br/>
<asp:TextBox id="QueryResult" runat="server" TextMode="MultiLine" Height="229px" Width="379"></asp:TextBox>
</form>
</body>
</HTML>
Finding a Particular Node in an XML Document (VB)
<%@ Page language="vb" AutoEventWireup="true" %>
<%@ Import Namespace="System.Data" %>
<script language="vb" runat="server">
Protected xmlSource As New System.Xml.XmlDocument()
Private Sub LoadButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
Dim xmlDocStream As System.IO.Stream = GetXmlDoc(XmlSourceTextBox.Text)
If Not (xmlDocStream Is Nothing) Then
xmlSource.Load(xmlDocStream)
ResultText.Text = xmlSource.InnerXml
Else
ResultText.Text = "Could not resolve the XML document."
End If
End Sub
Public Shared Function GetXmlDoc(ByVal xmlsource As String) As System.IO.Stream
Dim stream As System.IO.Stream = Nothing
If xmlsource.StartsWith("<?xml") Or xmlsource.StartsWith("<schema") Then
stream = New System.IO.MemoryStream(System.Text.ASCIIEncoding.ASCII.GetBytes(xmlsource))
Else
Try
Dim xmluri As New System.Uri(xmlsource)
If xmluri.IsFile Then
stream = New System.IO.FileStream(xmlsource, System.IO.FileMode.Open)
Else
Dim request As System.Net.HttpWebRequest = CType(System.Net.WebRequest.Create(xmluri), System.Net.HttpWebRequest)
Dim response As System.Net.WebResponse = request.GetResponse()
stream = response.GetResponseStream()
End If
Catch e As Exception
End Try "not a valid uri
End If
Return stream
End Function
Private Sub QueryButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
Dim s as new System.Text.StringBuilder()
If xmlSource Is Nothing Or xmlSource.InnerText = "" Then
xmlSource.LoadXml(ResultText.Text)
End If
Try
Dim nl As System.Xml.XmlNodeList = xmlSource.SelectNodes(XPathText.Text)
Dim counter As Integer = 1
Dim node As System.Xml.XmlNode
For Each node In nl
s.Append(Convert.ToString(counter) + "]" + node.InnerText + System.Environment.NewLine)
counter += 1
Next node
QueryResult.Text=s.ToString()
Catch selectNodesError As Exception
QueryResult.Text = selectNodesError.ToString()
End Try
End Sub
</script>
<HTML>
<HEAD>
<title>Finding a Particular Node in an XML Document</title>
</HEAD>
<body>
<form id="Form1" method="post" runat="server">
<asp:textbox id="XmlSourceTextBox" runat="server" Width="379px" Height="162px" TextMode="MultiLine"></asp:textbox><br/>
<asp:button id="LoadButton" runat="server" Text="Load XML Document" OnClick="LoadButton_Click"></asp:button><br/>
<asp:TextBox id="ResultText" runat="server" Width="379px" Height="194px" TextMode="MultiLine"></asp:TextBox><br/>
<asp:Button id="QueryButton" runat="server" Text="Query" OnClick="QueryButton_Click"></asp:Button><br/>
<asp:TextBox id="XPathText" runat="server" Width="379px"></asp:TextBox><br/>
<asp:TextBox id="QueryResult" runat="server" TextMode="MultiLine" Height="229px" Width="379"></asp:TextBox>
</form>
</body>
</HTML>
Use XML Path to locate Node and edit its value
<%--
Code Revised from
Professional ASP.NET 2.0 XML (Programmer to Programmer) (Paperback)
by Thiru Thangarathinam
# Publisher: Wrox (January 18, 2006)
# Language: English
# ISBN: 0764596772
--%>
<%@ Page Language="C#" %>
<%@ Import Namespace="System.Xml" %>
<%@ Import Namespace="System.Xml.XPath" %>
<script runat="server">
void Page_Load(object sender, EventArgs e)
{
//Set the ContentType to XML to write XML values
Response.ContentType = "text/xml";
string xmlPath = MapPath("MyBooks.xml");
XmlDocument document = new XmlDocument();
document.Load(xmlPath);
XPathNavigator navigator = document.CreateNavigator();
int count = navigator.Select("/bookstore/book").Count;
//Navigate to the right nodes
navigator.MoveToChild("bookstore", "");
navigator.MoveToChild("book", "");
//Loop through all the book nodes
for(int i = 0; i < count; i++)
{
navigator.MoveToChild("price", "");
double discount = navigator.ValueAsDouble +1;
navigator.CreateAttribute("", "discount", "", discount.ToString());
//Move to the parent book element
navigator.MoveToParent();
//Move to the next sibling book element
navigator.MoveToNext();
}
navigator.MoveToRoot();
Response.Write (navigator.OuterXml);
}
</script>
<%--
Code Revised from
Professional ASP.NET 2.0 XML (Programmer to Programmer) (Paperback)
by Thiru Thangarathinam
# Publisher: Wrox (January 18, 2006)
# Language: English
# ISBN: 0764596772
--%>
<%@ Page Language="C#" %>
<%@ Import Namespace="System.Xml" %>
<%@ Import Namespace="System.Xml.XPath" %>
<script runat="server">
void Page_Load(object sender, EventArgs e)
{
//Set the ContentType to XML to write XML values
Response.ContentType = "text/xml";
string xmlPath = MapPath("MyBooks.xml");
XmlDocument document = new XmlDocument();
document.Load(xmlPath);
XPathNavigator navigator = document.CreateNavigator();
int count = navigator.Select("/bookstore/book").Count;
//Navigate to the right nodes
navigator.MoveToChild("bookstore", "");
navigator.MoveToChild("book", "");
//Loop through all the book nodes
for(int i = 0; i < count; i++)
{
navigator.MoveToChild("price", "");
double discount = navigator.ValueAsDouble +1;
navigator.CreateAttribute("", "discount", "", discount.ToString());
//Move to the parent book element
navigator.MoveToParent();
//Move to the next sibling book element
navigator.MoveToNext();
}
navigator.MoveToRoot();
Response.Write (navigator.OuterXml);
}
</script>
Use XPath to read XML document
<%--
Code Revised from
Professional ASP.NET 2.0 XML (Programmer to Programmer) (Paperback)
by Thiru Thangarathinam
# Publisher: Wrox (January 18, 2006)
# Language: English
# ISBN: 0764596772
--%>
<%@ Page Language="C#" %>
<%@ Import Namespace="System.Xml" %>
<script runat="server">
void Page_Load(object sender, EventArgs e)
{
if (!Page.IsPostBack)
{
ddlExpressions.Items.Add("//book/title");
ddlExpressions.Items.Add("//book[@genre="novel"]/title");
ddlExpressions.Items.Add("//book/author/first-name");
ddlExpressions.Items.Add("//book[@genre="philosophy"]/title");
ddlExpressions.Items.Add("//book/price");
ddlExpressions.Items.Add("//book[3]/title");
ddlExpressions.SelectedIndex = 0;
UpdateDisplay();
}
}
void ddlExpressions_SelectedIndexChanged(object sender, EventArgs e)
{
UpdateDisplay();
}
void UpdateDisplay()
{
lstOutput.Items.Clear();
string xmlPath = MapPath("MyBooks.xml");
XmlDocument doc = new XmlDocument();
doc.Load(xmlPath);
XmlNodeList nodeList = doc.DocumentElement.SelectNodes(ddlExpressions.SelectedItem.Text);
foreach (XmlNode child in nodeList)
{
lstOutput.Items.Add("Node Name:" + child.Name);
lstOutput.Items.Add("Node Value:" + child.FirstChild.Value);
}
}
</script>
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>XPath Example</title>
</head>
<body>
<form id="form1" runat="server">
<div>
Select the XPath Expression:
<asp:DropDownList ID="ddlExpressions" AutoPostBack="true" runat="server" Width="410px" OnSelectedIndexChanged="ddlExpressions_SelectedIndexChanged">
</asp:DropDownList>
<br />
<br />
<asp:ListBox ID="lstOutput" runat="server" Width="587px" Height="168px"></asp:ListBox>
</div>
</form>
</body>
</html>
<%--
<?xml version="1.0"?>
<bookstore>
<book genre="autobiography">
<title>The Autobiography</title>
<author>
<first-name>A</first-name>
<last-name>B</last-name>
</author>
<price>999</price>
</book>
<book genre="novel">
<title>The Man</title>
<author>
<first-name>C</first-name>
<last-name>D</last-name>
</author>
<price>8888</price>
</book>
</bookstore>
--%>
<%@ Import Namespace="System" %>
<%@ Import Namespace="System.Xml" %>
<%@ Import Namespace="System.Xml.XPath" %>
<%@ Page Language="C#" %>
<script runat="server">
private void Page_Load(Object Source, EventArgs E)
{
StringBuilder sb = new StringBuilder();
String space2 = " ";
String space3 = " ";
XmlDocument _XmlDoc = new XmlDocument();
_XmlDoc.Load(Server.MapPath("Data.xml"));
XPathNavigator _Nav;
_Nav = _XmlDoc.CreateNavigator();
_Nav.MoveToRoot();
sb.Append("<B>Root: </B>");
sb.Append("name=" + _Nav.Name + ", type=" + _Nav.NodeType.ToString());
sb.Append("<BR/><BR/>");
_Nav.MoveToFirstChild();
sb.Append("name=" + _Nav.Name + ", type=" + _Nav.NodeType.ToString());
sb.Append("<BR/>");
_Nav.MoveToFirstChild();
do
{
sb.Append(space2);
sb.Append("name=" + _Nav.Name + ", type=" + _Nav.NodeType.ToString());
sb.Append("<BR/>");
_Nav.MoveToFirstAttribute();
sb.Append(space2);
sb.Append("Attribute: " + _Nav.Name + "=" + _Nav.Value);
sb.Append("<BR/>");
_Nav.MoveToParent();
_Nav.MoveToFirstChild();
do
{
sb.Append(space3);
sb.Append("name=" + _Nav.Name + ", type=" + _Nav.NodeType.ToString() + ", value=" + _Nav.Value);
sb.Append("<BR/>");
}while(_Nav.MoveToNext());
_Nav.MoveToParent();
}while(_Nav.MoveToNext());
OutputLiteral.Text = sb.ToString();
}
</script>
<html>
<head>
<title>Using the XPathNavigator for Navigating Xml Documents</title>
</head>
<body>
<form runat="server">
<!-- Insert content here -->
<asp:Literal id="OutputLiteral" runat="server"></asp:Literal>
</form>
</body>
</html>
File: Data.xml
<?xml version="1.0" encoding="utf-8" ?>
<users>
<user role="admin">
<username>jsmith</username>
<password>john</password>
</user>
<user role="operator">
<username>tcruise</username>
<password>tom</password>
</user>
</users>
<%--
Code Revised from
Professional ASP.NET 2.0 XML (Programmer to Programmer) (Paperback)
by Thiru Thangarathinam
# Publisher: Wrox (January 18, 2006)
# Language: English
# ISBN: 0764596772
--%>
<%@ Page Language="C#" %>
<%@ Import Namespace="System.Xml" %>
<script runat="server">
void Page_Load(object sender, EventArgs e)
{
if (!Page.IsPostBack)
{
ddlExpressions.Items.Add("//book/title");
ddlExpressions.Items.Add("//book[@genre="novel"]/title");
ddlExpressions.Items.Add("//book/author/first-name");
ddlExpressions.Items.Add("//book[@genre="philosophy"]/title");
ddlExpressions.Items.Add("//book/price");
ddlExpressions.Items.Add("//book[3]/title");
ddlExpressions.SelectedIndex = 0;
UpdateDisplay();
}
}
void ddlExpressions_SelectedIndexChanged(object sender, EventArgs e)
{
UpdateDisplay();
}
void UpdateDisplay()
{
lstOutput.Items.Clear();
string xmlPath = MapPath("MyBooks.xml");
XmlDocument doc = new XmlDocument();
doc.Load(xmlPath);
XmlNodeList nodeList = doc.DocumentElement.SelectNodes(ddlExpressions.SelectedItem.Text);
foreach (XmlNode child in nodeList)
{
lstOutput.Items.Add("Node Name:" + child.Name);
lstOutput.Items.Add("Node Value:" + child.FirstChild.Value);
}
}
</script>
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>XPath Example</title>
</head>
<body>
<form id="form1" runat="server">
<div>
Select the XPath Expression:
<asp:DropDownList ID="ddlExpressions" AutoPostBack="true" runat="server" Width="410px" OnSelectedIndexChanged="ddlExpressions_SelectedIndexChanged">
</asp:DropDownList>
<br />
<br />
<asp:ListBox ID="lstOutput" runat="server" Width="587px" Height="168px"></asp:ListBox>
</div>
</form>
</body>
</html>
<%--
<?xml version="1.0"?>
<bookstore>
<book genre="autobiography">
<title>The Autobiography</title>
<author>
<first-name>A</first-name>
<last-name>B</last-name>
</author>
<price>999</price>
</book>
<book genre="novel">
<title>The Man</title>
<author>
<first-name>C</first-name>
<last-name>D</last-name>
</author>
<price>8888</price>
</book>
</bookstore>
--%>