2012-11-12 39 views
12

Tôi đã thực hiện một phương pháp kiểm tra xem thuộc tính có tồn tại trong tệp XML hay không. Nếu nó không tồn tại, nó sẽ trả về "False". Nó hoạt động nhưng phải mất rất nhiều thời gian để phân tích cú pháp tệp. Dường như nó đọc toàn bộ tập tin cho mỗi hàng. Tôi đã bỏ lỡ một cái gì đó ở đây? Tôi có thể làm cho nó hiệu quả hơn bằng cách nào đó?Kiểm tra phân tích cú pháp XML nếu thuộc tính tồn tại

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

Tôi đã thử nghiệm để thay thế phương pháp này với một mà chỉ trả lại và nhận chuỗi:

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

} 

tôi đã thực hiện một XML-file với chỉ một dòng duy nhất. Bảng điều khiển in ra giá trị 15 lần. Bất kỳ ý tưởng?

+0

Tại sao bạn nên viết phiên bản XPath của riêng mình? – raina77ow

Trả lời

37

Giải Quyết! Không cần thêm phương thức:

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

Nếu bạn có rất nhiều trong số này ... bạn có thể đóng gói ....... chuỗi tư nhân SafeAttributeValue (XAttribute xattr) { chuỗi returnValue = string.Empty; nếu (null! = Xattr) { returnValue = (string) xattr.Value; } return returnValue; } – granadaCoder

2

Bạn có thể thử điều này và xem nếu có bất cứ cải tiến

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

Bây giờ với LINQ này, tất cả các thuộc tính được lưu trữ trong một cuốn từ điển (mỗi Node) và có thể được truy cập thông qua các tên thuộc tính.

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

Kiểm tra nếu một thuộc tính tồn tại trên tất cả các nút XML

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

Kiểm tra nếu thuộc tính xuất hiện ít nhất một lần

var AttributeFound = Result.Any(x => x.Attributes.ContainsKey("AttrName")); 
Các vấn đề liên quan