我试图编写一个从Unity .config文件中获取一些元素的方法。每个元素都有type和mapTo属性,我会获取它们的字符串值,获取我需要的子字符串并将它们放在两个单独的列表中。之后我想在一些数据网格中写下列表的内容。
问题是,在完成所有foreach循环后,代码将返回到用于检查单个寄存器的代码,并再次输入其他两个类型和mapTo值。 换句话说,在列表中,我获得了无数的字符串值,而不是仅获取一次。 我是一个初学者,我已经尝试了很多东西,但没有任何接缝可以完成工作。 有谁知道我错了什么? C#中的方法代码如下所示:
private void ReadAdvancedConfigFile(string path)
{
XElement root = null;
root = XElement.Load(new XmlTextReader(path));
if (root != null)
{
XNamespace ns = "http://schemas.microsoft.com/practices/2010/unity";
var registers = root.Element(ns + "unity").Element(ns + "container").Descendants(ns + "register");
if (registers.Count() > 0)
{
var tipList = registers.Select(x => x.Attribute("type").Value);
var mapToList = registers.Select(x => x.Attribute("mapTo").Value);
List<string> listresult = new List<string>();
List<string> listresultm = new List<string>();
foreach (var reg in registers)
{
foreach (var tpl in tipList)
{
var end = tpl.IndexOf(',');
var start = tpl.LastIndexOf('.', (end == -1 ? tpl.Length - 1 : end)) + 1;
var result = tpl.Substring(start, (end == -1 ? tpl.Length : end) - start);
listresult.Add(result);
}
foreach (var mpl in mapToList)
{
var endm = mpl.IndexOf(',');
var startm = mpl.LastIndexOf('.', (endm == -1 ? mpl.Length - 1 : endm)) + 1;
var resultm = mpl.Substring(startm, (endm == -1 ? mpl.Length : endm) - startm);
listresultm.Add(resultm);
}
int maxLenList = Math.Max(listresult.Count, listresultm.Count);
for (int i = 0; i < maxLenList; i++)
{
if (i < listresult.Count && i < listresultm.Count)
{
_obsCollection.Add(new Tuple<string, string>(listresult[i], listresultm[i]));
}
else if (i >= listresult.Count)
{
_obsCollection.Add(new Tuple<string, string>(string.Empty, listresultm[i]));
}
else if (i >= listresultm.Count)
{
_obsCollection.Add(new Tuple<string, string>(listresultm[i], string.Empty));
}
}
}
tabela.ItemsSource = _obsCollection;
}
}
}
方法从名为Load的按钮调用,从文件系统中的某个位置找到Unity.config文件,如下所示:
private void button1_Click(object sender, RoutedEventArgs e)
{
OpenFileDialog fDialog = new OpenFileDialog();
fDialog.Title = "Open XML file";
fDialog.Filter = "XML files|*.config";
fDialog.InitialDirectory = @"C:\";
bool? control = fDialog.ShowDialog();
if (control.Value)
{
var filePath = fDialog.FileName;
ReadAdvancedConfigFile(filePath);
}
}
在Unity.config中是使用这种格式的XML文件(我删除了大部分元素,在这里使用相同的空格,它也适用于此):
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<section name="unity" type="Microsoft.Practices.Unity.Configuration.UnityConfigurationSection, Microsoft.Practices.Unity.Configuration"/>
</configSections>
<unity xmlns="http://schemas.microsoft.com/practices/2010/unity">
<container name="container">
<register name="configService" type="Web.Common.Interfaces.IConfigService, Web.Common"
mapTo="Web.Common.Services.ConfigServiceImpl, Web.Common">
<lifetime type="singleton" />
<constructor>
<param name="res" value="Resources.ClientStrings"> </param>
<param name="configFile" value="webclient.config"> </param>
</constructor>
<!--<property name="LocalisationService" dependencyName="LocalisationService" />-->
<!--This is a property injection from the language plugin -->
</register>
<register name="scaleCoefConfigService" type="Web.WebClient.Services.IScaleCoefConfigService, Web.WebClient.TDMSWebApp"
mapTo="Web.WebClient.Services.Implementations.ScaleCoefConfigServiceImpl, Web.WebClient.TDMSWebApp">
<lifetime type="singleton" />
<constructor>
<param name="configService">
<dependency name="configService"/>
</param>
</constructor>
</register>
<register name="sessionService" type="Web.Common.Interfaces.ISessionService, Web.Common"
mapTo="Web.Common.Services.SessionServiceImpl, Web.Common">
<lifetime type="singleton" />
</register>
<register name="licenseManagerService" type="Web.Common.Interfaces.ILicenseManagementService, Web.Common"
mapTo="Web.Common.Services.LicenseManagementServiceImpl, Web.Common">
<lifetime type="singleton" />
</register>
</container>
</unity>
</configuration>
答案 0 :(得分:2)
向我看,好像你不需要foreach循环。当您使用LINQ查询时,您已经在获取所有'type'和'mapTo'属性:
var tipList = registers.Select(x => x.Attribute("type").Value);
var mapToList = registers.Select(x => x.Attribute("mapTo").Value);
这有效地为您提供了“寄存器”中xelements的所有属性。 你甚至没有在你的循环中使用var'reg'...
答案 1 :(得分:1)
我调整了您的代码,现在它可以正常工作(已移除foreach
):
XElement root = null;
root = XElement.Load(new XmlTextReader(path));
if (root != null)
{
XNamespace ns = "http://schemas.microsoft.com/practices/2010/unity";
var registers = root.Element(ns + "unity").Element(ns + "container").Descendants(ns + "register");
if (registers.Count() > 0)
{
var tipList = registers.Select(x => x.Attribute("type").Value);
var mapToList = registers.Select(x => x.Attribute("mapTo").Value);
List<string> listresult = new List<string>();
List<string> listresultm = new List<string>();
foreach (string tpl in tipList)
{
int end = tpl.IndexOf(',');
int start = tpl.LastIndexOf('.', (end == -1 ? tpl.Length - 1 : end)) + 1;
string result = tpl.Substring(start, (end == -1 ? tpl.Length : end) - start);
listresult.Add(result);
}
foreach (string mpl in mapToList)
{
int endm = mpl.IndexOf(',');
int startm = mpl.LastIndexOf('.', (endm == -1 ? mpl.Length - 1 : endm)) + 1;
string resultm = mpl.Substring(startm, (endm == -1 ? mpl.Length : endm) - startm);
listresultm.Add(resultm);
}
int maxLenList = Math.Max(listresult.Count, listresultm.Count);
for (int i = 0; i < maxLenList; i++)
{
if (i < listresult.Count && i < listresultm.Count)
{
_obsCollection.Add(new Tuple<string, string>(listresult[i], listresultm[i]));
}
else if (i >= listresult.Count)
{
_obsCollection.Add(new Tuple<string, string>(string.Empty, listresultm[i]));
}
else if (i >= listresultm.Count)
{
_obsCollection.Add(new Tuple<string, string>(listresultm[i], string.Empty));
}
}
}
}