2009-05-11 23 views
20

bir xml dosyadan tüm unsurları adını alabilirC# nasıl ben xml dosyasıdır örneğin bir xml dosyadan tüm öğe adını almak istiyorum

<BookStore> 
    <BookStoreInfo> 
    <Address /> 
    <Tel /> 
    <Fax /> 
    <BookStoreInfo> 
    <Book> 
    <BookName /> 
    <ISBN /> 
    <PublishDate /> 
    </Book> 
    <Book> 
    .... 
    </Book> 
</BookStore> 
ben almak istiyorum

öğenin adı "BookName". "ISBN" ve "PublishDate" ve sadece bu isimler, "BookStoreInfo" ve onun alt düğümünün adı değil,

Çeşitli yöntemler denedim, ancak çalışmıyor, nasıl yapabilirim? XPath

XmlDocument xdoc = new XmlDocument(); 
xdoc.Load(something); 
XmlNodeList list = xdoc.SelectNodes("//BookStore"); 

kullanma

cevap

27

Peki adlı belgedeki tüm düğümler içeren bir liste verir LINQ XML:

foreach(var name in doc.Root.DescendantNodes().OfType<XElement>() 
     .Select(x => x.Name).Distinct()) 
{ 
    Console.WriteLine(name); 
} 

vardır sürü Yine de benzer rotalardan.

+0

Çok teşekkürler deneyebilirsiniz ur kök öğesi ise

http://taporware.ualberta.ca/~taporware/xmlTools/listxml.shtml

. LINQ-XML ile famliar değilim. Ama çok iyi çalışıyor. Bir şey daha, yukarıdaki soruyu güncelledim. Çocuk düğümlerini sadece öğesinin altına nasıl alabilirim. – Smallville

+0

Eğer "Kitap" altında (eğer güncelleştirilmiş soruya göre) kastediyorsunuz - bir şey gibi: doc.Root.Element ("Kitap"). DescendantNodes() ... –

+1

Evet, demek istediğim. Ve kod çalışıyor, tekrar teşekkürler! – Smallville

9

XDocument ile, kitapçı

2

XPATH'u kullanarak yapmayı deneyebilirsiniz.

XmlDocument doc = new XmlDocument(); 
doc.LoadXml("xml string"); 

XmlNodeList list = doc.SelectNodes("//BookStore/Book"); 
3

C# 3.0 kullanıyorsanız, aşağıdakileri yapabilirsiniz:

var data = XElement.Load("c:/test.xml"); // change this to reflect location of your xml file 

var allElementNames = 
    (from e in in data.Descendants() 
    select e.Name).Distinct(); 
+0

ile tek bir satırda yapabildiğinizi gösterir. C# 3.5 diye bir şey yoktur; Ancak C# 3.0 ve .NET 3.5 kullanır. –

+0

Biliyorum ... Adam cevabımı düzenledi. Onu tekrar tamir ettim. –

+0

Harika cevap. Her etiketin kaç kez göründüğünü nasıl sayarsınız? – fab

4

Bunu yapmanın titiz yolu (adil olmak ve doğru şekilde) bir sahip olacak Şema sözleşmesi tanımı ve bu şekilde okuyun. Söyleniyor, sen ... böyle bir şey yapabileceğini

List<string> nodeNames = new List<string>(); 

foreach(System.Xml.XmlNode node in doc.SelectNodes("BookStore/Book")) 
{ 
    foreach(System.Xml.XmlNode child in node.Children) 
    { 
     if(!nodeNames.Contains(child.Name)) nodeNames.Add(child.Name); 
    } 
} 

Bu, kuşkusuz, Book düğümün çocukları için ayrı düğüm adlarının listesini elde etmek için bir ilkel yöntem, fakat daha fazlası belirtmedi edilir çevrenizde (eğer 3.5'e sahipseniz, bunu yapmak için LINQ'ı XML'e kullanabilirsiniz), fakat bu, işinizin çevrenize bakılmaksızın yapılmasını sağlamalıdır.

5

Adam'a katılıyorum, ideal koşul, xml dosyasının içeriğini tanımlayan bir şemaya sahip olmaktır. Ancak bazen bu mümkün değildir. Burada, bir xml belgesinin tüm düğümlerini yinelemek ve benzersiz yerel adları depolamak için bir sözlük kullanmak için basit bir yöntem var. Her yerel adın derinliğini izlemeyi seviyorum, bu yüzden derinliği depolamak için bir int listesi kullanıyorum. Tüm belgeyi XmlDocument'ın yaptığı gibi yüklemediğinden, XmlReader'ın "bellekte kolay" olduğunu unutmayın. Bazı durumlarda, xml verilerinin boyutu küçük olduğu için küçük bir fark yaratır. Aşağıdaki örnekte, bir XmlReader ile 18,5MB bir dosya okunur. Bu verileri yüklemek için bir XmlDocument kullanmak, içeriğini okumak ve örneklemek için bir XmlReader kullanmaktan daha az verimli olurdu. Sadece XML dosyası yükleyerek ve bir sonuç web sayfası olarak isimlerini yazdırmak - Burada bulmak

string documentPath = @"C:\Docs\cim_schema_2.18.1-Final-XMLAll\all_classes.xml"; 

Dictionary<string, List<int>> nodeTable = new Dictionary<string, List<int>>(); 
using (XmlReader reader = XmlReader.Create(documentPath)) 
{ 
    while (!reader.EOF) 
    { 
     if (reader.NodeType == XmlNodeType.Element) 
     { 
      if (!nodeTable.ContainsKey(reader.LocalName)) 
      { 
       nodeTable.Add(reader.LocalName, new List<int>(new int[] { reader.Depth })); 
      } 
      else if (!nodeTable[reader.LocalName].Contains(reader.Depth)) 
      { 
       nodeTable[reader.LocalName].Add(reader.Depth); 
      } 
     } 
     reader.Read(); 
    } 
} 
Console.WriteLine("The node table has {0} items.",nodeTable.Count); 
foreach (KeyValuePair<string, List<int>> kv in nodeTable) 
{ 
    Console.WriteLine("{0} [{1}]",kv.Key, kv.Value.Count); 
    for (int i = 0; i < kv.Value.Count; i++) 
    { 
     if (i < kv.Value.Count-1) 
     { 
      Console.Write("{0}, ", kv.Value[i]); 
     } 
     else 
     { 
      Console.WriteLine(kv.Value[i]); 
     } 
    } 
} 
0

çevrimiçi bir araç güzelce bu öğelerin ın isimlerini çıkarabilir.

enter image description here

2

kitabevi sonra u kod aşağıdaki

XmlDocument doc = new XmlDocument(); 
     doc.Load(configPath); 
     XmlNodeList list = doc.DocumentElement.GetElementsByTagName("Book"); 
     if (list.Count != 0) 
     { 
      for (int i = 0; i < list[0].ChildNodes.Count; i++) 
      { 
       XmlNode child = list[0].ChildNodes[i]; 

      } 
     } 
+0

Bu kabul edilenlerden daha iyi bir cevaptır. – Jansky

İlgili konular