XML parse проверить, если атрибут существует
Я сделал метод, который проверяет, существует ли атрибут в XML-файле. Если он не существует, он возвращает "False". Он работает, но для анализа файла требуется очень много времени. Кажется, он читает весь файл для каждой отдельной строки. Я что-то пропустил? Могу ли я сделать его более эффективным?
public static IEnumerable<RowData> getXML(string XMLpath)
{
XDocument xmlDoc = XDocument.Load("spec.xml");
var specs = from spec in xmlDoc.Descendants("spec")
select new RowData
{
number= (string)spec.Attribute("nbr"),
name= (string)spec.Attribute("name").Value,
code = (string)spec.Attribute("code").Value,
descr = (string)spec.Attribute("descr").Value,
countObject = checkXMLcount(spec),
return specs;
}
public static string checkXMLcount(XElement x)
{
Console.WriteLine(x.Attribute("nbr").Value);
Console.ReadLine();
try
{
if (x.Attribute("mep_count").Value == null)
{
return "False";
}
else
{
return x.Attribute("mep_count").Value;
}
}
catch
{
return "False";
}
}
Я тестировал, чтобы заменить метод на тот, который только возвращает и получает строку:
public static string checkXMLcount(string x)
{
Console.WriteLine(x);
Console.ReadLine();
return x;
}
Я сделал XML-файл только с одной строкой. Печать консоли значение 15 раз. Есть идеи?
2 ответов
решена! Нет необходимости в дополнительном методе:
countObject = spec.Attribute("mep_count") != null ? spec.Attribute("mep_count").Value : "False",
вы можете попробовать это и посмотреть, есть ли какие-либо улучшения
class xmlAttributes
{
public string Node;
public Dictionary<string, string> Attributes;
}
теперь с помощью этого LINQ все атрибуты хранятся в словаре (на узел) и могут быть доступны через имя атрибута.
var Result = XElement.Load("somedata.xml").Descendants("spec")
.Select(x => new xmlAttributes
{
Node = x.Name.LocalName,
Attributes = x.Attributes()
.ToDictionary(i => i.Name.LocalName,
j => j.Value)
});
проверяет, существует ли атрибут на всех узлах XML
var AttributeFound = Result.All(x => x.Attributes.ContainsKey("AttrName"));
проверяет, появляется ли атрибут хотя бы один раз
var AttributeFound = Result.Any(x => x.Attributes.ContainsKey("AttrName"));