繁体   English   中英

查询 XML 文件的更简单方法? C# - MVC.Net

[英]Easier way to query an XML file? C# - MVC .Net

截至目前,我的代码运行良好,没有任何问题,但我想输入是否有更简单的方法来读取 XML 文件。

所以这里是我在做什么的总结:

  1. 我有一个处理几个外部因素的大型程序。 有一次,我收到了一个 XML 文件,其中包含许多不同的元素和子节点。
  2. 对于每个预期的元素,我创建了一个 class,其中包含将保存来自节点的所有数据的变量。

这不是我的 XML 文件的样子,但这里有一个简单的例子 mocking 它让你更好地了解我正在使用什么。

   -<status>
   -<CallBase FilePath="EU\Domain Users" CallValid="True" CodedPath="D:\Users\CASE\" 
   TracePath="D:\Users\CASE\" StartEnviorment="" ServerLogs="" ServerPath="" ConfigPort="217757" 
   PacePort="217757" Version="2.5.0.73" Version2="10.3.0.73" VersionName="CASEservice" 
   LastTimeCheck="08/05/2020 15:05:07">
   <ValidPermissions Default=""/>
   </CallBase>
   </status>

我为名为“CallBase”的 CallBase 元素创建了一个 class,其中包含 FilePath、CallValid、CodedPath、TracePath、StartEnviorment、ServerLogs、ServerPath、ConfigPort、PacePort、Version 等字符串。

以下是我如何读取此特定节点并将其存储在 CallBase object 中:

private CallBase getCallBaseData(List<XmlDocument> xmlDoc, int i)                                             
    {
        var result = xmlDoc[i].DocumentElement.SelectNodes("//CallBase");
        foreach (var node in result)
        {
            var temp1 = node.ToString();
        }

        XmlNode xmlNode = xmlDoc[i].SelectSingleNode("//CallBase");

        XmlSerializer serial = new XmlSerializer(typeof(CallBase));

        CallBase tempresult = (CallBase)serial.Deserialize(new XmlNodeReader(xmlNode));

        return tempresult;
    }

但是,现在我有很多相同的功能,我用不同的元素名称替换了“CallBase”。 我想知道是否有其他方法可以做到这一点,所以我只有一个 function。

一组仅在元素类型上有所不同的方法可以用一个通用方法替换。

幸运的是,xml 元素的名称与 class 类型的名称相匹配。 我们将使用Type.Name属性从那里获取它。

private T GetData<T>(List<XmlDocument> xmlDoc, int i)
{
    var xpath = "//" + typeof(T).Name;

    var result = xmlDoc[i].DocumentElement.SelectNodes(xpath);

    foreach (var node in result)
    {
        var temp1 = node.ToString();
    }

    var xmlNode = xmlDoc[i].SelectSingleNode(xpath);

    var serial = new XmlSerializer(typeof(T));

    var tempresult = (T)serial.Deserialize(new XmlNodeReader(xmlNode));

    return tempresult;
}

使用:

GetData<CallBase>(..., ...);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM