У меня есть XML-файл, в котором данные разбросаны. Я должен получить все значения ячеек, которые находятся под тегом XML <managedObject class="JTS"
, информация о зависимом сайте разбросана по тегу XML <managedObject class="CCF"
, а другая информация о зависимой мощности разбросана по тегу XML <managedObject class="POC"
. Я использую XmlReader.ReadFrom
, чтобы взять небольшой раздел и обработку, но теперь проблема в том, что XML важен для каждой ячейки, сайта и информации о мощности, и для этого я каждый раз читаю весь большой XML-файл, что является плохой логикой и занимает много времени. Есть ли способ, которым я могу загрузить все ячейки (скажем, 5000 ячеек) в классы и соответствующие сайты, передать всю необходимую информацию для ячеек в классы и затем обработать классы, используя итерацию foreach
. Я использую код и фрагмент XML, как показано ниже
<managedObject class="JTS" version="BSC17" distName="PLMN-PLMN/BSC-404500">
<p name="name">VM_25261_G1_A</p>
<p name="cellBarQualify">0</p>
<p name="cellBarred">0</p>
<p name="cId">25261</p>
<p name="hoppingMode">1</p>
<p name="hoppingSequenceNumber1">54</p>
<managedObject class="CCF" version="BSC17" distName="PLMN-PLMN/BSC-404500">
<p name="name">ET_AR_G_0267_GHABATGHAYATI</p>
<p name="SBTSId">10267</p>
<p name="abisInterfaceConnectionType">2</p>
<p name="adminState">1</p>
<managedObject class="POC" version="BSC17" distName="PLMN-PLMN/BSC-404500">
<p name="alpha">0</p>
<p name="bepPeriod">10</p>
<p name="bsTxPwrMax">0</p>
<p name="bsTxPwrMax1x00">0</p>
и код
using (XmlReader xr = XmlReader.Create(path, settings))
{
xr.MoveToContent();
while (xr.Read())
{
while (xr.NodeType == XmlNodeType.Element && xr.LocalName == "managedObject" && xr.GetAttribute("class") == "JTS")
{
dist_name = xr.GetAttribute("distName");
dist_name_ori = dist_name;
XElement pin = (XElement)XNode.ReadFrom(xr);
cell_name = GetValueForNokia(pin, "name");
DataTable dtSiteDetails = GetSiteDetails2G(path, dist_name, settings);
DataTable dtBasePowrDetails = GetBasePowrDetails2G(path, dist_name_ori, settings);
private static DataTable GetSiteDetails2G(string path, string cell_nametomatchwith_sitename, XmlReaderSettings settings)
{
DataTable dt = null;
try
{
using (XmlReader xr = XmlReader.Create(path, settings))
{
xr.MoveToContent();
while (xr.Read())
{
while (xr.NodeType == XmlNodeType.Element && xr.LocalName == "managedObject" && xr.GetAttribute("class") == "CCF")
{
distname = xr.GetAttribute("distName");
XElement pin = (XElement)XNode.ReadFrom(xr);
if (distname == cell_nametomatchwith_sitename)
{
DataRow dr = dt.NewRow();
dr[0] = xr.GetAttribute("version");
dr[1] = GetValueForNokia(pin, "name");
dt.Rows.Add(dr);
done = true;
break;
}
else
break;
}
if (done)
break;
}
}
}
catch (Exception)
{
throw;
}
return dt;
}
private static DataTable GetBasePowrDetails2G(string path, string cell_nametomatchwith_POC, XmlReaderSettings settings)
{
try
{
dt = new DataTable();
dt.Columns.Add("bsTxPwrMax");
using (XmlReader xr = XmlReader.Create(path, settings))
{
xr.MoveToContent();
while (xr.Read())
{
while (xr.NodeType == XmlNodeType.Element && xr.LocalName == "managedObject" && xr.GetAttribute("class") == "POC")
{
distname = xr.GetAttribute("distName");
XElement pin = (XElement)XNode.ReadFrom(xr);
if (distname == cell_nametomatchwith_POC)
{
DataRow dr = dt.NewRow();
dr[0] = GetValueForNokia(pin, "bsTxPwrMax");
dt.Rows.Add(dr);
done = true;
break;
}
else
break;
}
if (done)
break;
}
}
}
catch (Exception)
{
throw;
}
return dt;
}
private static string GetValueForNokia(XElement pin, string input)
{
XNamespace ns = "raml20.xsd";
var output = pin.Descendants(ns + "p").FirstOrDefault(
p => p.Attributes("name").FirstOrDefault(a => a.Value == input) != null
);
return output == null ? null : output.Value;
}
Здесь у меня есть две ячейки PLMN-PLMN/BSC-404500/BTS-123
и PLMN-PLMN/BSC-404501/BTS-123
во фрагменте XML, вот так у меня 5000 ячеек
<?xml version="1.0" encoding="utf-8" ?>
<root>
<managedObject class="JTS" version="BSC17" distName="PLMN-PLMN/BSC-404500/BTS-123">
<p name="name">VM_25261_G1_A</p>
<p name="cellBarQualify">0</p>
<p name="cellBarred">0</p>
<p name="cId">25261</p>
<p name="hoppingMode">1</p>
<p name="hoppingSequenceNumber1">54</p>
</managedObject>
.
.
<managedObject class="CCF" version="BSC17" distName="PLMN-PLMN/BSC-404500">
<p name="name">ET_AR_G_0267_GHABATGHAYATI</p>
<p name="SBTSId">10267</p>
<p name="abisInterfaceConnectionType">2</p>
<p name="adminState">1</p>
</managedObject>
.
.
<managedObject class="POC" version="BSC17" distName="PLMN-PLMN/BSC-404500">
<p name="alpha">0</p>
<p name="bepPeriod">10</p>
<p name="bsTxPwrMax">0</p>
<p name="bsTxPwrMax1x00">0</p>
</managedObject>
<managedObject class="JTS" version="BSC17" distName="PLMN-PLMN/BSC-404501/BTS-123">
<p name="name">VM_25262_G1_A</p>
<p name="cellBarQualify">0</p>
<p name="cellBarred">0</p>
<p name="cId">25262</p>
<p name="hoppingMode">1</p>
<p name="hoppingSequenceNumber1">54</p>
</managedObject>
.
.
<managedObject class="CCF" version="BSC17" distName="PLMN-PLMN/BSC-404501">
<p name="name">ET_AR_G_0267_GHABATGHAYATI</p>
<p name="SBTSId">10267</p>
<p name="abisInterfaceConnectionType">2</p>
<p name="adminState">1</p>
</managedObject>
.
.
<managedObject class="POC" version="BSC17" distName="PLMN-PLMN/BSC-404501">
<p name="alpha">0</p>
<p name="bepPeriod">10</p>
<p name="bsTxPwrMax">10</p>
<p name="bsTxPwrMax1x00">0</p>
</managedObject>
</root>