C# .NET 中的 XML 和 XSLT 入门






3.95/5 (12投票s)
在本文中,您将了解如何在 C# .NET 中创建和读取 XML 文件,如何添加新元素、新属性以及替换现有 XML 文件中的现有元素值。
引言
当我开始为我的项目处理 XML 时,我对此概念非常陌生。当然,您可以在互联网上找到许多关于如何在 .NET 中读写 XML 文件、如何将其转换为 HTML 文件、如何更改现有 XML 文件等资源的资料。但我没有找到一个涵盖所有这些主题的资源。
在此示例中,我包含了所有这些主题,例如创建 XML 文件、读取 XML 文件、向现有 XML 文件添加元素和属性、将 XML 转换为 HTML,以及将属性从 .cs 文件传递到 .xsl 文件。
使用代码
创建和读取 XML
在此示例中,我使用两种技术创建了一个 XML 文件。
- 使用
XmlDocument
- 使用
XmlTextWriter
填写姓名、年龄、职业、教育程度字段,然后点击“使用 XmlDocument 创建 XML”或“使用 XmlTextWriter
创建 XML”按钮,XML 文件(sampleXML.xml)将被创建。
sampleXML.xml
<?xml version="1.0" encoding="utf-8"?>
<!--Your comments.-->
<Sample name="pal">
<Name>pal</Name>
<Age>24</Age>
<Job>software</Job>
<Education>
<Exam>BE</Exam>
<Discipline>ETC</Discipline>
<College>XYZ</College>
<Percent>62%</Percent>
</Education>
<Education>
<Exam>12</Exam>
<Discipline>ET</Discipline>
<College>ABC</College>
<Percent>87%</Percent>
</Education>
</Sample>
现在让我们讨论代码。要使用 XML,首先需要添加 System.Xml
命名空间。
使用 XmlDocument
XmlDocument xmldoc = new XmlDocument();
XmlElement ElmntRoot;
//Create XML using XmlDocument
private void createXML()
{
xmldoc.RemoveAll();
xmldoc.AppendChild(xmldoc.CreateProcessingInstruction("xml", "version='1.0'"));
SaveFileDialog sfd = new SaveFileDialog();
sfd.FileName = Application.StartupPath + "\\sampleXML.xml";
ElmntRoot = xmldoc.CreateElement("Sample");
//Adding attribute
ElmntRoot.SetAttribute("name", textBox1.Text);
//Adding text to element
XmlElement ele1 = null;
ele1 = xmldoc.CreateElement("Name");
ele1.InnerText = textBox1.Text;
ElmntRoot.AppendChild(ele1);
XmlElement ele2 = null;
ele2 = xmldoc.CreateElement("Age");
ele2.InnerText = textBox2.Text;
ElmntRoot.AppendChild(ele2);
XmlElement ele3 = null;
ele3 = xmldoc.CreateElement("Job");
ele3.InnerText = textBox3.Text;
ElmntRoot.AppendChild(ele3);
foreach (ListViewItem item in listView1.Items)
{
XmlElement ele4 = null;
ele4 = xmldoc.CreateElement("Education");
XmlElement child1 = null;
child1 = xmldoc.CreateElement("Exam");
child1.InnerText = item.SubItems[0].Text;
ele4.AppendChild(child1);
XmlElement child2 = null;
child2 = xmldoc.CreateElement("Discipline");
child2.InnerText = item.SubItems[1].Text;
ele4.AppendChild(child2);
XmlElement child3 = null;
child3 = xmldoc.CreateElement("College");
child3.InnerText = item.SubItems[2].Text;
ele4.AppendChild(child3);
XmlElement child4 = null;
child4 = xmldoc.CreateElement("Percent");
child4.InnerText = item.SubItems[3].Text;
ele4.AppendChild(child4);
ElmntRoot.AppendChild(ele4);
}
xmldoc.AppendChild(ElmntRoot);
xmldoc.Save(sfd.FileName);
MessageBox.Show("XML file created.",
"Sample", MessageBoxButtons.OK, MessageBoxIcon.Information);
System.Diagnostics.Process.Start(sfd.FileName);
}
要使用 XmlDocument
创建 XML,首先要声明一个 XmlDocument
对象。
XmlDocument xmldoc = new XmlDocument();
然后删除所有节点和属性(如果它们已存在)。
xmldoc.RemoveAll();
声明根元素,XmlElement ElmntRoot
;根元素是所有其他元素的父元素。
CreateElement
用于在 XML 文件中创建新元素。
例如,我已按如下方式创建了根元素;
ElmntRoot = xmldoc.CreateElement("Sample");
其中“Sample”是元素名称。
如果要为当前节点设置属性,请按如下方式使用 SetAttribute
ElmntRoot.SetAttribute("name", textBox1.Text);
在这里,name
是属性的名称,textBox1.Text
是属性的值。
一个元素可以包含其他元素,元素也可以包含属性。
现在让我们按如下方式在根元素下添加一个子元素
XmlElement ele1 = null;
ele1 = xmldoc.CreateElement("Name");
ele1.InnerText = textBox1.Text;
ElmntRoot.AppendChild(ele1);
InnerText
用于设置当前元素的值。一旦声明了子元素及其值,就按如下方式将子元素附加到根元素;
ElmntRoot.AppendChild(ele1);
AppendChild
用于将指定的节点添加到此节点子节点列表的末尾。
您可以按照上述方式添加更多子节点。
为了使 XML 结构更复杂一些,请参见将列表视图数据添加到 XML 的代码。
在此代码中,我将列表视图项目的内容添加到了 <Education></Education>
标签下。
为每个列表视图项目内容创建子元素,如代码所示。
在这种情况下,<Education> 将作为其子元素 <Exam>、<Discipline>、<College>、<Percent> 的父元素。这些子元素被附加到其父元素 <Education>。最终,该父元素被附加到根元素。
请记住,在 XML 文件中,必须声明根元素。所有其他元素都添加到此根元素下。所有元素都应具有开始标签 <Name> 和结束标签 </Name>。添加完所有元素和属性并将它们附加到根元素后,最后一步是将此根元素附加到 xmldocument
,如下所示
xmldoc.AppendChild(ElmntRoot);
然后将 XML 文件保存到指定位置。
xmldoc.Save(sfd.FileName);
使用 XmlTextWriter
//Create XML using XmlTextWriter
private void Createxml1()
{
SaveFileDialog sfd = new SaveFileDialog();
sfd.FileName = Application.StartupPath + "\\sampleXML.xml";
XmlTextWriter textWriter = new XmlTextWriter(sfd.FileName, Encoding.UTF8);
//Create a xml file
try
{
textWriter.Formatting = Formatting.Indented;
//Open the xml document to write
textWriter.WriteStartDocument();
//write commnets
textWriter.WriteComment("Your comments.");
//write element
textWriter.WriteStartElement("Sample");
//write attribute
textWriter.WriteAttributeString("name", textBox1.Text);
textWriter.WriteElementString("Name", textBox1.Text);
textWriter.WriteElementString("Age", textBox2.Text);
textWriter.WriteElementString("Job", textBox3.Text);
foreach (ListViewItem item in listView1.Items)
{
textWriter.WriteStartElement("Education");
textWriter.WriteElementString("Exam", item.SubItems[0].Text);
textWriter.WriteElementString("Discipline",item.SubItems[1].Text);
textWriter.WriteElementString("College", item.SubItems[2].Text);
textWriter.WriteElementString("Percent", item.SubItems[3].Text);
textWriter.WriteEndElement();
}
textWriter.WriteFullEndElement();
MessageBox.Show("XML file created.",
"Sample", MessageBoxButtons.OK, MessageBoxIcon.Information);
System.Diagnostics.Process.Start(sfd.FileName);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
finally
{
textWriter.WriteEndDocument();
textWriter.Flush();
textWriter.Close();
}
}
声明一个 XmlTextWriter
对象,指定 XML 文件的完整路径和编码方式。
XmlTextWriter textWriter = new XmlTextWriter(sfd.FileName, Encoding.UTF8);
使用 XmlTextWriter
创建 XML 的代码与 XmlDocument
不同。
在此,首先使用代码打开 XML 文档进行写入
textWriter.WriteStartDocument();
如果您想在 XML 中添加注释,请使用
textWriter.WriteComment("Your comments.");
要创建根元素,请使用
textWriter.WriteStartElement("Sample");
您可以使用以下方式为元素添加属性
textWriter.WriteAttributeString("name", textBox1.Text);
子元素可以按如下方式添加
textWriter.WriteElementString("Name", textBox1.Text);
对于每个 WriteStartElement
,必须有其对应的关闭属性 WriteEndElement()
,如下所示;
textWriter.WriteEndElement();
请注意,WriteStartElement
和 WriteEndElement
必须按照正确的顺序,以避免进一步的错误。
然后使用以下命令创建完整的结束标签
textWriter.WriteFullEndElement();
这用于处理像 <Name /> 这样的 XML 标签,它没有完整的结束元素。WriteFullEndElement()
会将其转换为类似 <Name></Name> 的形式,以便结束标签可以正常工作。
最后结束 XML 文档并关闭它。
textWriter.WriteEndDocument();
textWriter.Flush();
textWriter.Close();
以上就是关于使用 XmlDocument
和 XmlTextWriter
在 C# 中创建 XML 的全部内容。您可以在附加的示例应用程序中找到有关编辑/替换任何元素或属性、向现有 XML 添加新元素的代码。
现在让我们看看如何使用 XSL 样式表将 XML 转换为 HTML。
使用 XSLT 将 XML 转换为 HTML
我假设您对 XSL 样式表有基本的了解。如果没有,我建议您先了解创建 XSL 文件的基本知识。在附加的示例应用程序中,您可以在 Debug 文件夹中找到 sample-stylesheet.xsl。
XSLT 是 XSL 转换。它用于将任何 XML 文档转换为浏览器可识别的另一种类型的文档(HTML)。
现在让我们进入编码部分。以下是将 XML 文件转换为 HTML 的代码。
string xmlfile = Application.StartupPath + "\\sampleXML.xml";
//Sending data from cs to XSL
string logo = Application.StartupPath + "//" + "1rightarrow-32.png";
string name = textBox1.Text;
XsltArgumentList xslArgs = new XsltArgumentList();
xslArgs.AddParam("logo", "", logo);
xslArgs.AddParam("name", "", name);
XslTransform xslt = new XslTransform();
xslt.Load("sample-stylesheet.xsl");
XPathDocument xpath = new XPathDocument(xmlfile);
XmlTextWriter xwriter = new XmlTextWriter(xmlfile + ".html", Encoding.UTF8);
xslt.Transform(xpath, xslArgs, xwriter, null);
xwriter.Close();
创建 XSLT 对象。
XslTransform xslt = new XslTransform();
或
XslCompiledTransform xslt = new XslCompiledTransform();
在此对象中加载您的样式表
xslt.Load("sample-stylesheet.xsl");
使用 XPathDocument 加载您的 XML 文件XPathDocument xpath = new XPathDocument(xmlfile);
您可以使用 XsltArgument 将参数从我们的代码传递到您的样式表。XsltArgumentList xslArgs = new XsltArgumentList();
xslArgs.AddParam("logo", "", logo);
xslArgs.AddParam("name", "", name);
在样式表中,参数定义如下<xsl:param name="logo"/>
<xsl:param name="name"/>
在上面的 xslArgs.AddParam 代码中,第一个参数“logo”是您在样式表中定义的参数的名称,第三个参数“logo”是要传递给您的样式表的值。在附带的示例应用程序中,我正在将一个图像文件和一个字符串传递给样式表,这些将在我们的 HTML 文件中显示。注意:XsltArgumentList 是可选的。如果您不想传递任何参数,只需在下面的代码中将 xslArgs 替换为 NULL 即可。最后,将这些参数传递给我们的对象。xslt.Transform(xpath, xslArgs, xwriter, null);
xwriter.Close();
完成!!! :) 您也可以使用上述相同的 xslt 代码将 XML 转换为 DOC 文件。只需将 XmlTextWriter 对象中的“.html”更改为“.doc”即可。自己试试。如果您有任何疑问和建议,请告诉我。 :)