首页 > 解决方案 > 使用 linq 两次读取 xml 文件

问题描述

我正在尝试读取 xml 文件。然后提取一些有用的数据来绘制图形。我已经达到了预期的输出。但问题是我的程序两次读取 xml 文件以提取有用的数据。这需要一些额外的时间。有没有其他方法可以只读取一次文件。? 谢谢

<?xml version="1.0" encoding="UTF-8"?>
<CanConformanceTesterLog Version="4.1">
  <TestProperties>
    <Item name="IUT Name" value="Reference"/>
    <Item name="PG Clock Period" value="1000 ns"/>
</TestProperties>
  <SignalData SamplingPeriod="1000.000 ns" DataWidth="16 bit">
    <Signal>
      <Id>IUT_RX</Id>
      <InitState>1</InitState>
      <![CDATA[HQFPAVkBiwGVAZ8BqQHHAdEBAwINAjUCPwJxAnsCrQK3AsEC1QLzAv0CEQMbAzkDTQNrA3UDfwOJA7sDxQPtA/cDKQQzBEcEUQSDBI0EtQTJBN0E5wTxBAUFDwUZBS0FNwVBBUsFVQWHFZEVmxWlFa8VuRXDFc0V1xXhFesV9RX/FTEWOxZFFk8WgRaLFpUWnxapFscW0RbbFuUW7xYDFyEXPxdJF1MXGhgkGC4YTBhWGHQYfhiwGLoY2BjiGBQZHhkoGTIZUBlaGXgZghmgGaoZvhnbGeUZ9RwTHR0dTx1ZHYsdlR29Hccd+R0DHg0eFx5JHlMeZx6ZHsEe6R4lH5Qfsh+8H+4f+B8qIDQgXCBmIJggoiCsILYg6CDyIAYhOCFgIYghxCEzIlEiWyKNIpciySLTIvsiBSM3I0EjSyNVI4cjmyOlI9cj/yMTJB0kpyaxJrsmxSbPJgEnCyc9J0cnZSdvJ6EnqyfdJ+cnGSgjKC0oQShLKF8ocyiHKJsopSivKLkowyjWKOAo8jQkNS41YDVqNZw1pjXENc41ADYKNhQ2HjZGNlA2WjZkNm42eDaWNqo2tDbHNtE2uDd=]]>
    </Signal>
    <Signal>
      <Id>IUT_TX</Id>
      <InitState>1</InitState>
      <![CDATA[SwVVBYcVkRWbFaUVrxW5FcMVzRXXFeEV6xX1Ff8VMRY7FkUWTxaBFosWlRafFqkWxxbRFtsW5RbvFgMXIRc/FxoYJBguGEwYVhh0GH4YsBi6GNgY4hgUGR4ZKBkyGVAZWhl4GYIZoBmqGb4Z6B4kH4ghxCETJB0kpyaxJrsmxSbPJgEnCyc9J0cnZSdvJ6EnqyfdJ+cnGSgjKC0oQShLKF8ocyiHKJsopSivKLkowyjyNCQ1LjVgNWo1nDWmNcQ1zjUANgo2FDYeNkY2UDZaNmQ2bjZ4NpY2qja0Nrg3]]>
    </Signal>
</SignalData>
</CanConformanceTesterLog>

我有读取标签“SignalData”数据的函数。然后在读取此数据后它调用另一个函数并传递xml文件的名称,dataWidth,samplingPeriod。然后第二个函数读取“信号”标签..然后从每个“信号”中提取数据。最后,当一切都完成后,调用一个函数来绘制图形......

private bool SignalDataInfo(string fileName)
        {
            var xdoc = XDocument.Load(fileName);
            if (xdoc != null)
            {
                var signalData = xdoc.Descendants("SignalData");
                foreach (var signal in signalData)
                {
                    var width = signal.Attribute("DataWidth").Value;
                    string dataWidth = width.Substring(0, width.IndexOf(" "));
                    var period = signal.Attribute("SamplingPeriod").Value;
                    string samplingPeriod = period.Substring(0, period.IndexOf(" "));
                    SignalData(fileName,dataWidth, samplingPeriod);
                }
                return true;
            }
            else
                return false;
        }

public bool SignalData(string fileName,string width, string period)
        {var xdoc = XDocument.Load(fileName);
            if (xdoc != null)
            {
                var signalData = xdoc.Descendants("Signal");

                foreach (var signal in signalData)
                { // extract data from every signal }
return true;
else false;
}

标签: c#xmllinq

解决方案


您可以通过保存加载到类变量(例如)中的 XDocument 来加载 XML 文件一次,private XDocument xDoc;而不是在每个方法上创建一个实例。此外,如果您只单独检索 XML 数据也会有所帮助,在这种情况下,loadData()您可以使用该方法来初始化数据一次。这也将使您的代码以某种方式分离关注点。请参见下面的代码:

private XDocument xDoc;

private void loadData(string fileName)
{
   xDoc = XDocument.Load(fileName);
}

private bool SignalDataInfo()
        {
            if (xDoc != null)
            {
                var signalData = xDoc.Descendants("SignalData");
                foreach (var signal in signalData)
                {
                    var width = signal.Attribute("DataWidth").Value;
                    string dataWidth = width.Substring(0, width.IndexOf(" "));
                    var period = signal.Attribute("SamplingPeriod").Value;
                    string samplingPeriod = period.Substring(0, period.IndexOf(" "));
                    SignalData(fileName,dataWidth, samplingPeriod);
                }
                return true;
            }
            else
                return false;
        }

public bool SignalData(string width, string period)
        {
            if (xDoc != null)
            {
                var signalData = xDoc.Descendants("Signal");

                foreach (var signal in signalData)
                { // extract data from every signal }
return true;
else false;
}

希望这可以帮助!


推荐阅读