递归遍历XML文档
使用C#的WPF建立程序,下面有具体的代码以及详细的注释
- `按钮的点击事件
- private void button_Click(object sender, RoutedEventArgs e)
{
XmlDocument document = new XmlDocument();
document.Load(“GhostStories.xml”);
var doc = document.DocumentElement;//获取文档的根
textBlock.Text = FormatedText(document.DocumentElement as XmlNode, “”, “”);
}` - `递归的函数
///
/// 读取xml
///
/// 根节点
/// 返回的读取的字符串
/// 空格和回车
///
private string FormatedText(XmlNode xmlNode, string text, string ident)
{//XmlText表示元素或者属性的文本内容,比如title节点中有字符串才进行此操作 if (xmlNode is XmlText) { //xmlNode.Value获取或者设置节点的值 text += xmlNode.Value; return text;//用来结束本次递归结束,返回上一个节点 } //用来回车换行 if (string.IsNullOrEmpty(ident)) { ident = ""; } else { text += "\r\n" + ident; } if (xmlNode is XmlDocument)//为文档提供各种信息 { text += xmlNode.OuterXml;//获取包含子节点以及之外的节点 return text; } text += "<" + xmlNode.Name; if (xmlNode.Attributes.Count > 0) { //使用ref型参数时,传入的参数必须先被初始化。对out而言,必须在方法中对其完成初始化。 AddAttriute(xmlNode, ref text); } if (xmlNode.HasChildNodes) { text += ">"; //每次递归操作通过return text;操作返回上一个节点 foreach (XmlNode child in xmlNode.ChildNodes) { text = FormatedText(child, text, ident + " ");//节点,读取的文本内容,回车换行控制 } //为true代表是包含文本节点的节点,每次递归后返回foreach再运行之后的语句。 if (xmlNode.ChildNodes.Count == 1 && (xmlNode.FirstChild is XmlText || xmlNode.FirstChild is XmlDocument)) { text += "</" + xmlNode.Name + ">"; } else //添加的结束节点,不包含文本节点的节点 { text += "\r\n" + ident + "</" + xmlNode.Name + ">"; } } else { text += "/>"; } return text;