2012-11-12 17 views
12

Zrobiłem metodę, która sprawdza, czy atrybut istnieje w pliku XML. Jeśli nie istnieje, zwraca "False". Działa, ale parsowanie pliku trwa bardzo długo. Wygląda na to, że odczytuje cały plik dla każdego pojedynczego wiersza. Czy coś tu przeoczyłem? Czy mogę w jakiś sposób zwiększyć jego skuteczność?Analiza składni XML, czy istnieje atrybut

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"; 
     } 
    } 

Testowałem zastąpić metodę z takim, który zwraca tylko i odbierać ciąg:

public static string checkXMLcount(string x) 
{ 
    Console.WriteLine(x); 
    Console.ReadLine(); 
    return x; 

} 

Zrobiłem pliku XML z tylko jednym rzędzie. Konsola wypisuje wartość 15 razy. Jakieś pomysły?

+0

Po co pisać własną wersję XPath, zastanawiam się? – raina77ow

Odpowiedz

37

rozwiązany! Żadna dodatkowa metoda nie jest potrzebna:

countObject = spec.Attribute("mep_count") != null ? spec.Attribute("mep_count").Value : "False", 
+2

Jeśli masz wiele z nich ... możesz enkapsulować ....... private string SafeAttributeValue (XAttribute xattr) { string returnValue = string.Empty; if (null! = Xattr) { returnValue = (string) xattr.Value; } return returnValue; } – granadaCoder

2

Można spróbować i zobaczyć, czy istnieje jakakolwiek poprawa

class xmlAttributes 
{ 
    public string Node; 
    public Dictionary<string, string> Attributes; 
} 

Teraz z tym LINQ, wszystkie atrybuty są przechowywane w słowniku (na węzeł) i mogą być dostępne za pośrednictwem nazwy atrybutu.

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) 
         }); 

Sprawdza czy atrybut istnieje na wszystkich węzłów XML

var AttributeFound = Result.All(x => x.Attributes.ContainsKey("AttrName")); 

sprawdza czy atrybut pojawia się przynajmniej raz

var AttributeFound = Result.Any(x => x.Attributes.ContainsKey("AttrName")); 
Powiązane problemy