2016-03-26 17 views
1

Temel olarak bir XML dosyası içeren, etiketler ve her şey içeren bir dize var. Bir etiketle özellikle ilgileniyorum, <address source>. Sorun şu ki, XML dosyası her zaman aynı değil. Bazen sadece bir tane <address source> etiket bulunabilir, bazen 5 tanesi mevcut olabilir ve hatta bazen 20 veya daha fazla olabilir.Dizin içindeki her dizini bulun ve dizinleri ayrı ayrı depolayın.

string XMLToAnalyze = "<XML><TAG1>somecontent</TAG1><address source>content</address source><address source>content</address source><TAG2>morecontent</TAG2></XML>"` 

Yani, bu özel dizede iki kere etiketi <address source> var:

Yani, benim dize böyle bir şey düşünün. Ben gerekenler

şudur ki:

ben her etiket <address source> ait Index (veya IndexOf) bulmalıyız ve ben bu indeksleri (endeks başına bir tamsayı) tercihen gerçekten ayrı tamsayılar içinde, ayrı ayrı depolanır ihtiyaç veya alternatif olarak bir dizide. Bunun nedeni, Winform formundaki bazı alanları doldurmak için her bir ayrı tam sayıya erişmem gerekmesidir.

Bu mümkün mü?

+1

Xml düğüm , ** kaynak ** Bir niteliktir wrong.In edilir? – kranthiv

+0

XML'iniz, ona atfetme şekliniz geçersiz. '

' boş 'source' özniteliğine sahip' Address' düğümüdür. Bu korkunç gözetime hitap etmek için kaynak almak isteyebilirsiniz. –

+1

Sadece XML’i iyi bir şekilde ele almayı tercih etmediğinizden emin misiniz, XML? –

cevap

1

İhtiyacınız olan bir IDictionary < [string], IList < [int] >>. Bir açılış etiketini ararken, bunları şu şekilde sözlükte depolayabilirsiniz: Etiket varsa, yeni bulunan dizini eklenen listeye ekleyin, aksi halde yeni bir listeyi sözlüğe yeni bir listeyle ekleyin. İçinde tek bir öğe - endeksin ilk oluşumu. Tüm dizgiyi geçtikten sonra - sözlüğünüz aradığınız haritayı alacak.

public static class XmlTagMapBuilder 
{ 
    public static IDictionary<string, IList<int>> GetOpenTagIndexMap(string inputXml) 
    { 
     // Argument validation goes here 

     IDictionary<string, IList<int>> result = new Dictionary<string, IList<int>>(); 

     int currentIndex = -1; 
     string lastOpenTag = null; 
     while (true) 
     { 
      string nextOpenTagName; 
      int nextOpenTagIndex; 
      if (TryGetNextOpenTagIndex(inputXml, currentIndex, out nextOpenTagName, out nextOpenTagIndex)) 
      { 
       lastOpenTag = nextOpenTagName; 
       currentIndex = nextOpenTagIndex; 

       IList<int> tagIndicies; 
       if (!result.TryGetValue(nextOpenTagName.ToUpperInvariant(), out tagIndicies)) 
       { 
        tagIndicies = new List<int>(); 
        result.Add(nextOpenTagName, tagIndicies); 
       } 

       tagIndicies.Add(nextOpenTagIndex); 
      } 
      else 
      { 
       break; 
      } 
     } 

     return result; 
    } 

    /// <summary> 
    /// Tries to get next open tag in the given <see cref="inputXml"/> string after the specified startIndex. 
    /// </summary> 
    /// <param name="inputXml">The string which contains the xml tags.</param> 
    /// <param name="startIndex">The index after which to look for the open tag.</param> 
    /// <param name="nextOpenTagName">If a tag was found, contains its name.</param> 
    /// <param name="nextOpenTagIndex">If a tag was found, contains the start index of it.</param> 
    /// <returns>true - if the tag was found. false - otherwise.</returns> 
    private static bool TryGetNextOpenTagIndex(string inputXml, int startIndex, out string nextOpenTagName, out int nextOpenTagIndex) 
    { 
     // Need to add implementaiton here 
    } 
} 
+0

Hiç sözlüklere aşina değilim. Bunu, dizim ile bağlantılı olarak nasıl yapılacağına dair bir örnek göstermek mümkün mü? – SomebodyWithAQuestion

1

Kullanım Regex maç üzerinden tüm dizeleri ve daha sonra döngü maç ve her maçın endeksleri bulmak için.

Bu mantık çalışmalıdır. Bu eşleşen dizge tüm endeksler olacak

 List<int> indexes = new List<int>(); 
     string XMLToAnalyze = "<XML><TAG1>somecontent</TAG1><address source>content</address source><address source>content</address source><TAG2>morecontent</TAG2></XML>"; 
     var regex = new Regex(@"<address source>"); 

     foreach (Match match in regex.Matches(XMLToAnalyze)) 
     { 
      indexes.Add(match.Index); 
     } 

indexesTested olmuştur.


Çıktı: görevde 29, 69

+0

Teşekkürler, bu bana tanıdık bir kod. Bir soru olsa da, bir textBox içinde 'index'leri nasıl görüntüleyebilirim? – SomebodyWithAQuestion

+0

Webformları kullanıyor musunuz? Mvc? veya başka bir şey? Nerede kullandığım metin kutusu –

+0

Windows Forms var. Ama sanırım onu ​​zaten buldum: Çok satırlı bir alandaki indeksleri görüntülemek için string.join (environment.newline, indexes) 'i kullandım. Yine de başka bir soru: listelerde yeni: Örneğin, listedeki ikinci öğe nasıl çıkarılır? Endeksi kullanarak – SomebodyWithAQuestion

İlgili konular