在 C# 中从 XML 加载 TreeView 和 XML 控件
Loading TreeView and XML control from XML in C#
我以前从未使用过 XML 和 TreeView 或 XML 控件,根据一些在线教程,我拼凑了一个可用的 TreeView 和 XML 控件,但我有几个问题:1) 除了文本之外,TreeView 还显示节点的实际名称,2) 当我一次只想显示一个页面时,XML 控件一次显示所有页面,3 ) 如何配置 TreeView 以 XML 控制更改页面?
XML 控件的 XSLT 样式sheet:
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl" >
<xsl:output method="xml" indent="yes"/>
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="/">
<book>
<xsl:for-each select="book/page">
<div class="content">
<div class="nav">
<a class="prev" id="prev">Previous Page</a>
<span class="sep">|</span>
<div class="title" id="divTitle">
<xsl:value-of select="title" />
</div>
<span class="sep2">|</span>
<a class="next" id="next">Next Page</a>
</div>
<div class="main">
<xsl:value-of select="content"/>
</div>
<div id="thisPage" class="page">
<xsl:value-of select="pgno" />
</div>
</div>
</xsl:for-each>
</book>
</xsl:template>
</xsl:stylesheet>
TreeView 的 XSLT 样式 sheet:
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="/book">
<xsl:for-each select="book/page/title">
<xsl:value-of select="title" />
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
XML 文件:
<book time="" title="">
<page time="">
<title></title>
<content>
</content>
<pgno></pgno>
</page>
</book>
我正在像这样在后面的代码中加载 TreeView 和 XML 控件:
Page_Load:
XmlDocument doc = new XmlDocument();
doc.Load(myXml);
tvBook.Nodes.Clear();
XmlNodeList nodelist = doc.SelectNodes("book/page/title");
XmlDocument cDoc = new XmlDocument();
cDoc.LoadXml("<title></title>");
foreach (XmlNode node in nodelist)
{
XmlNode newElem = cDoc.CreateNode(XmlNodeType.Element, node.Name, node.LocalName);
newElem.InnerText = node.InnerText;
cDoc.DocumentElement.AppendChild(newElem);
}
tvBook.Nodes.Add(new TreeNode(cDoc.DocumentElement.Name));
TreeNode tNode = new TreeNode();
tNode = tvBook.Nodes[0];
AddNode(cDoc.DocumentElement, tNode);
tvBook.ExpandAll();
xmlContent.DocumentSource = myXml;
xmlContent.TransformSource = myStyle;
附加方法:
private void AddNode(XmlNode inXmlNode, TreeNode inTreeNode)
{
XmlNode xNode;
TreeNode tNode;
XmlNodeList nodeList;
int i;
if (inXmlNode.HasChildNodes)
{
nodeList = inXmlNode.ChildNodes;
for (i = 0; i < nodeList.Count; i++)
{
xNode = nodeList.Item(i);
inTreeNode.ChildNodes.Add(new TreeNode(xNode.Name));
tNode = inTreeNode.ChildNodes[i];
AddNode(xNode, tNode);
}
}
else
{
inTreeNode.Text = (inXmlNode.OuterXml).Trim();
}
}
我在屏幕上的输出如下所示:
树视图
title
title
First Page of My Book
title
Second Page of My Book
XML控制
Previous Page TITLE Next Page
CONTENT
Page No
解决方案更新:由于一些额外的问题迫使我如何实现我的 objective 更改问题 2 和 3 不再需要解决。但是,我将以下答案标记为正确,因为它确实为我解决了问题 1。
XDocument 是 XML Linq 而 XmlDocument 是标准的 XML。
试试下面的代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Linq;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
string input =
"<book time=\"\" title=\"\">" +
"<page time=\"\">" +
"<title></title>" +
"<content>" +
"</content>" +
"<pgno></pgno>" +
"</page>" +
"</book>";
XDocument doc = XDocument.Parse(input);
// or from a file
//XDocument doc = XDocument.Load(filename);
XElement title = doc.Descendants("title").FirstOrDefault();
}
}
}
我以前从未使用过 XML 和 TreeView 或 XML 控件,根据一些在线教程,我拼凑了一个可用的 TreeView 和 XML 控件,但我有几个问题:1) 除了文本之外,TreeView 还显示节点的实际名称,2) 当我一次只想显示一个页面时,XML 控件一次显示所有页面,3 ) 如何配置 TreeView 以 XML 控制更改页面?
XML 控件的 XSLT 样式sheet:
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl" >
<xsl:output method="xml" indent="yes"/>
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="/">
<book>
<xsl:for-each select="book/page">
<div class="content">
<div class="nav">
<a class="prev" id="prev">Previous Page</a>
<span class="sep">|</span>
<div class="title" id="divTitle">
<xsl:value-of select="title" />
</div>
<span class="sep2">|</span>
<a class="next" id="next">Next Page</a>
</div>
<div class="main">
<xsl:value-of select="content"/>
</div>
<div id="thisPage" class="page">
<xsl:value-of select="pgno" />
</div>
</div>
</xsl:for-each>
</book>
</xsl:template>
</xsl:stylesheet>
TreeView 的 XSLT 样式 sheet:
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="/book">
<xsl:for-each select="book/page/title">
<xsl:value-of select="title" />
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
XML 文件:
<book time="" title="">
<page time="">
<title></title>
<content>
</content>
<pgno></pgno>
</page>
</book>
我正在像这样在后面的代码中加载 TreeView 和 XML 控件:
Page_Load:
XmlDocument doc = new XmlDocument();
doc.Load(myXml);
tvBook.Nodes.Clear();
XmlNodeList nodelist = doc.SelectNodes("book/page/title");
XmlDocument cDoc = new XmlDocument();
cDoc.LoadXml("<title></title>");
foreach (XmlNode node in nodelist)
{
XmlNode newElem = cDoc.CreateNode(XmlNodeType.Element, node.Name, node.LocalName);
newElem.InnerText = node.InnerText;
cDoc.DocumentElement.AppendChild(newElem);
}
tvBook.Nodes.Add(new TreeNode(cDoc.DocumentElement.Name));
TreeNode tNode = new TreeNode();
tNode = tvBook.Nodes[0];
AddNode(cDoc.DocumentElement, tNode);
tvBook.ExpandAll();
xmlContent.DocumentSource = myXml;
xmlContent.TransformSource = myStyle;
附加方法:
private void AddNode(XmlNode inXmlNode, TreeNode inTreeNode)
{
XmlNode xNode;
TreeNode tNode;
XmlNodeList nodeList;
int i;
if (inXmlNode.HasChildNodes)
{
nodeList = inXmlNode.ChildNodes;
for (i = 0; i < nodeList.Count; i++)
{
xNode = nodeList.Item(i);
inTreeNode.ChildNodes.Add(new TreeNode(xNode.Name));
tNode = inTreeNode.ChildNodes[i];
AddNode(xNode, tNode);
}
}
else
{
inTreeNode.Text = (inXmlNode.OuterXml).Trim();
}
}
我在屏幕上的输出如下所示:
树视图
title
title
First Page of My Book
title
Second Page of My Book
XML控制
Previous Page TITLE Next Page
CONTENT
Page No
解决方案更新:由于一些额外的问题迫使我如何实现我的 objective 更改问题 2 和 3 不再需要解决。但是,我将以下答案标记为正确,因为它确实为我解决了问题 1。
XDocument 是 XML Linq 而 XmlDocument 是标准的 XML。
试试下面的代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Linq;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
string input =
"<book time=\"\" title=\"\">" +
"<page time=\"\">" +
"<title></title>" +
"<content>" +
"</content>" +
"<pgno></pgno>" +
"</page>" +
"</book>";
XDocument doc = XDocument.Parse(input);
// or from a file
//XDocument doc = XDocument.Load(filename);
XElement title = doc.Descendants("title").FirstOrDefault();
}
}
}