Program.cs
using N_31Brands.api.Xml;
using System;
namespace XmlDemo
{
class Program
{
static void Main(string[] args)
{
for (int i = 0; i < 10; i++)
{
var node = XmlHelper.GetInfoByPageName("Proceedings");
var list = XmlHelper.GetNodeItemList(node);
Console.WriteLine($"i = {i}");
}
}
}
}
以下是Xml文件夹,里面有 FieldParsing.XML、FieldItem.cs、XmlHelper.cs三个文件。
依次如下:
FieldItem.cs
using System;
namespace XmlDemo.Xml
{
public class FieldItem
{
public string displayName { get; set; }
public Type type { get; set; }
public string hyFieldId { get; set; }
/// <summary>
///
/// </summary>
public string feFieldName { get; set; }
}
}
FieldParsing.XML
<?xml version="1.0" encoding="utf-8"?>
<root name="根节点">
<PageName name="EnterpriseInfo" displayName="企业信息字段">
<field displayName="参展企业名称" type="string" hyFieldId="Field631147859" feFieldName="631147915"></field>
<field displayName="联系方式" type="string" hyFieldId="Field631147861" feFieldName="631147916"></field>
<field displayName="营业执照" type="string" hyFieldId="BusinessLicense" feFieldName="631147917"></field>
</PageName>
<PageName name="Credential" displayName="证件申请">
<field displayName="姓名 " type="string" hyFieldId="" feFieldName=""></field>
<field displayName="日期 " type="datetime" hyFieldId="" feFieldName=""></field>
<field displayName="性别 " type="int" hyFieldId="" feFieldName=""></field>
<field displayName="身份证号 " type="string" hyFieldId="" feFieldName=""></field>
<field displayName="户籍所在地 " type="json" hyFieldId="" feFieldName=""></field>
<field displayName="工作单位 " type="string" hyFieldId="" feFieldName=""></field>
</PageName>
</root>
XmlHelper.cs
using System;
using System.Collections.Generic;
using System.IO;
using System.Xml;
using XmlDemo.Xml;
namespace N_31Brands.api.Xml
{
public class XmlHelper
{
/// <summary>
/// 单例模式
/// </summary>
public static XmlNodeList pageNodeListSingleton;
// 定义一个标识确保线程同步
private static readonly object locker = new object();
// 定义私有构造函数,使外界不能创建该类实例
private XmlHelper()
{
}
//定义公有方法提供一个全局访问点。
public static XmlNodeList GetInstance()
{
//这里的lock其实使用的原理可以用一个词语来概括“互斥”这个概念也是操作系统的精髓
//其实就是当一个进程进来访问的时候,其他进程便先挂起状态
if (pageNodeListSingleton == null)//区别就在这里
{
lock (locker)
{
// 如果类的实例不存在则创建,否则直接返回
if (pageNodeListSingleton == null)
{
var xmlPath = $@"Xml/FieldParsing.XML";
XmlDocument xmlDoc = new XmlDocument();
var initTree = Environment.CurrentDirectory;
var projRootPath = Directory.GetParent(Directory.GetParent(initTree).ToString()).ToString();
xmlPath = Path.Combine(projRootPath, xmlPath);
Console.WriteLine("执行一次Xml.Loadd()");
xmlDoc.Load(xmlPath);
//这是肯定的,因为xmlDoc必然有两个childrenNodes,一个<xml>,一个<root>
if (xmlDoc.ChildNodes.Count == 2)
{
XmlNode initXmlTreeNode = xmlDoc.ChildNodes[1]; //<root>
pageNodeListSingleton = initXmlTreeNode.ChildNodes;
}
}
}
}
return pageNodeListSingleton;
}
/// <summary>
///
/// </summary>
/// <param name="pageName"></param>
/// <returns></returns>
public static XmlNode GetInfoByPageName(string pageName)
{
var pageNodeList = XmlHelper.GetInstance();
if (pageNodeList.Count == 0)
{
return null;
}
for (int i = 0; i < pageNodeList.Count; i++)
{
var name = pageNodeList[i].Attributes["name"].Value;
if (name == pageName)
{
return pageNodeList[i];
}
}
return null;
}
public static List<FieldItem> GetNodeItemList(XmlNode node)
{
if (node == null)
{
return null;
}
List<FieldItem> list = new List<FieldItem>() { };
for (var i = 0; i < node.ChildNodes.Count; i++)
{
var t = node.ChildNodes[i];
list.Add(new FieldItem()
{
displayName = t.Attributes["displayName"].Value,
// type = t.Attributes["displayName"].Value,
hyFieldId = t.Attributes["hyFieldId"].Value,
feFieldName = t.Attributes["feFieldName"].Value,
});
}
return list;
}
}
}
引用如下,并没有添加什么新的引用。