none
xmlden veri çekme hakkında(yardım) RRS feed

  • Soru

  • ben bi xmlden verileri çekmek istiyorum ama xml standart değil mesela xmlde esya bilgisi diye bi bölüm var altında bir veya daha fazla esya olabiliyor kac tane olacagı belli degil .o yüzden verilerin hepsini aynı anda çekip bakmam lazım ben tek tek çekebiliyorum ama hepsi aynı anda olmuyor yapamadım nasıl yapabilirim?
    12 Ocak 2012 Perşembe 14:22

Yanıtlar

  • t eb orada benim kullandigim tanimlayici isimleri. tt ebx de olabilirdi onlar. 

    content.Descendants("Tasima") tum "Tasima" nodlarini aliyor. t bu nodlarin bir tanesi (bir tablo gibi dusun Tasima diye, n tane satiri olacak, Descendants tum satirlarini IEnumerable olarak getiriken, t bir satira isaret ediyor. Ya da DataRow gibi dusun). t'nin icinde "SatirNo", "KapCinsi" gibi elementler var. Sonrasi onlari aliyor. Bunlarin yanisira "EsyaBilgileri" nodu ve onun icinde "EsyaBilgisi" nodlari (satirlari) var. t.Elements("EsyaBilgileri") her bir t'nin EsyaBilgileri elementlerini aliyor ve bir tanesi eb ile tanimlaniyor. eb'nin de "EsyaBilgisi" nodlari var, eb.Elements("EsyaBilgisi") ile o donuyor. Bir tanesi ebs olarak isaret ediliyor. ebs'nin de elementleri var "KalemSiraNo", "EsyaKodu" gibi. Sonucta sen IEnumerable<anonymous> tipinde tasima objesini elde ediyorsun. Kabaca onun yapisi da:

    int SatirNo
    string KapCinsi
    IEnumerable<anonymous> EsyaBilgileri

    EsyaBilgileri de:

    int KalemSiraNo
    string EsyaKodu

    Avantaji daha sonra da istedigin gibi sorgulayip parcalayabilmen. Mesela sen sadece tasima.SatirNo = 1'in EsyaBilgilerini istiyorsan:

    var tasimaSorgu = tasima.Single(t => t.SatirNo == 1).EsyaBilgileri;

    Aslinda sen bu xml'ini etrafina <root> </root> koyarak bir dosyaya koysan (c:\temp\Sample.xml) ve LinqPad'de (linqPad.net - ucretsiz, ancak intellisense istersen ucret odemen gerekiyor) asagidaki kodu calistirsan daha iyi anlayacaksin. Bence Linq ile XDocument, XElement serisini kullan. Asagida LinqPad icin kod ve ciktisi:

    void Main()
    {
    XDocument content;
    using (StreamReader s = File.OpenText(@"c:\temp\Sample.xml"))
    {
      content = XDocument.Load(s);
    }
    var tasima = from t in content.Descendants("Tasima")
    select new {
      SatirNo = (int)t.Element("SatirNo"),
      KapCinsi = (string)t.Element("KapCinsi"),
      EsyaBilgileri = from eb in t.Elements("EsyaBilgileri")
                      from ebs in eb.Elements("EsyaBilgisi")
          select new {
            KalemSiraNo = (int)ebs.Element("KalemSiraNo"),
            EsyaKodu = (string)ebs.Element("EsyaKodu")
          }};
    
    var tasimaSorgu = tasima.Single (t => t.SatirNo == 1).EsyaBilgileri;
    tasimaSorgu.Dump();
    tasima.Dump();
    
    }
    

    5IEnumerable<> (2 items)
    KalemSiraNoΞΞ EsyaKodu

    1

    0101

    2

    0101

    3  

     

    5IEnumerable<> (2 items)
    SatirNoΞΞ KapCinsi EsyaBilgileri

    1

    BI

    5IEnumerable<> (2 items)
    KalemSiraNoΞΞ EsyaKodu

    1

    0101

    2

    0101

    3  

    2

    BI

    5IEnumerable<> (2 items)
    KalemSiraNoΞΞ EsyaKodu

    1

    0101

    2

    0101

    3  
    3    

     

    13 Ocak 2012 Cuma 11:47
    Yanıtlayıcı

Tüm Yanıtlar

  • xml örneğini görebilirmiyiz.
    12 Ocak 2012 Perşembe 15:17
    Yanıtlayıcı
  •  

    <Tasima>
      <SatirNo>1</SatirNo>
      <KapCinsi>BI</KapCinsi>
       <EsyaBilgileri>
    - <EsyaBilgisi>
      <KalemSiraNo>1</KalemSiraNo>
      <EsyaKodu>0101</EsyaKodu>
       </EsyaBilgisi>
    - <EsyaBilgisi>
      <KalemSiraNo>2</KalemSiraNo>
      <EsyaKodu>0101</EsyaKodu>
        </EsyaBilgisi>
      </EsyaBilgileri>
      </Tasima>
    - <Tasima>
      <SatirNo>2</SatirNo>
      <KapCinsi>BI</KapCinsi>
      - <EsyaBilgileri>
    - <EsyaBilgisi>
      <KalemSiraNo>1</KalemSiraNo>
      <EsyaKodu>0101</EsyaKodu>
        </EsyaBilgisi>
    - <EsyaBilgisi>
      <KalemSiraNo>2</KalemSiraNo>
      <EsyaKodu>0101</EsyaKodu>
       </EsyaBilgisi>
      </EsyaBilgileri>
      </Tasima>
    xml böyle bişey ben kac tane kap var o kapa ait kac tane esya var bunları bulmak istiyorum ama yapamadım

     

    12 Ocak 2012 Perşembe 15:40
  • Bunun root elemani yok. Bu xmlin < root > ... < /root > seklinde oldugunu ve c:\Dizin\tasima.xml dosyasinda oldugunu dusunursek:

     

    XDocument content;
    using (StreamReader s = File.OpenText(@"c:\Dizin\tasima.xml"))
    {
      content = XDocument.Load(s);
    }
    var tasima = from t in content.Descendants("Tasima")
    select new {
      SatirNo = (int)t.Element("SatirNo"),
      KapCinsi = (string)t.Element("KapCinsi"),
      EsyaBilgileri = from eb in t.Elements("EsyaBilgileri")
                      from ebs in eb.Elements("EsyaBilgisi")
          select new {
            KalemSiraNo = (int)ebs.Element("KalemSiraNo"),
            EsyaKodu = (string)ebs.Element("EsyaKodu")
          }};
    
    

    12 Ocak 2012 Perşembe 16:25
    Yanıtlayıcı
  • http://onursalkaya.blogspot.com/2011/12/c-linq-to-xml-ile-dokuman-okumak.html
    12 Ocak 2012 Perşembe 16:29
    Yanıtlayıcı
  • http://onursalkaya.blogspot.com/2011/12/c-linq-to-xml-ile-dokuman-okumak.html
    bununla oluyor ama kayıtları cekip mesela bi comboboxa atarsam hepsini aynı item da gösteriyor onları nasıl parcalayabilirim 
    13 Ocak 2012 Cuma 08:01
  • Bunun root elemani yok. Bu xmlin < root > ... < /root > seklinde oldugunu ve c:\Dizin\tasima.xml dosyasinda oldugunu dusunursek:

     

     

    XDocument content;
    using (StreamReader s = File.OpenText(@"c:\Dizin\tasima.xml"))
    {
      content = XDocument.Load(s);
    }
    var tasima = from t in content.Descendants("Tasima")
    select new {
      SatirNo = (int)t.Element("SatirNo"),
      KapCinsi = (string)t.Element("KapCinsi"),
      EsyaBilgileri = from eb in t.Elements("EsyaBilgileri")
                      from ebs in eb.Elements("EsyaBilgisi")
          select new {
            KalemSiraNo = (int)ebs.Element("KalemSiraNo"),
            EsyaKodu = (string)ebs.Element("EsyaKodu")
          }};
    
    

     

    bununla olcak sanırım istedigim sey ama kodu biraz acıklayablr msn t eb ne falan bide tasıma var dısında ne ile yazılabilir?
    13 Ocak 2012 Cuma 08:03
  • kod kısmını gösterebilirseniz daha iyi yardımcı olabiliriz.
    13 Ocak 2012 Cuma 08:32
    Yanıtlayıcı
  •  XmlDocument xmlDoc = new XmlDocument();
                xmlDoc.Load(@"C:\temp\deneme.xml");
                string[] dizi = new string[100];
                foreach (XmlNode node in xmlDoc.GetElementsByTagName("Esya"))// root kısmı
               {
                   comboBox2.Items.Add(nod["EsyaBilgisi"].InnerText);
                    
                }
    böyle yazdıgımda xmldeki verileri çekiyor hepsini aynı satıra yazıyor onu nasıl parcalayabilirim?
    13 Ocak 2012 Cuma 09:31
  • bide bunu buldum tüm değerleri çekmek için ama çalışmıyor neden olabilir 

    XPathDocument doc = new XPathDocument(@"C:\temp\deneme.xml");

                XPathNavigator navigator = doc.CreateNavigator();

     

                XPathNodeIterator nodes = navigator.Select("Gelen/OzetBeyanBilgisi");

     

                while (nodes.MoveNext())

                {

                   comboBox1.Items.Add(nodes.Current.ToString());

                }

     

                }

    13 Ocak 2012 Cuma 09:56
  • t eb orada benim kullandigim tanimlayici isimleri. tt ebx de olabilirdi onlar. 

    content.Descendants("Tasima") tum "Tasima" nodlarini aliyor. t bu nodlarin bir tanesi (bir tablo gibi dusun Tasima diye, n tane satiri olacak, Descendants tum satirlarini IEnumerable olarak getiriken, t bir satira isaret ediyor. Ya da DataRow gibi dusun). t'nin icinde "SatirNo", "KapCinsi" gibi elementler var. Sonrasi onlari aliyor. Bunlarin yanisira "EsyaBilgileri" nodu ve onun icinde "EsyaBilgisi" nodlari (satirlari) var. t.Elements("EsyaBilgileri") her bir t'nin EsyaBilgileri elementlerini aliyor ve bir tanesi eb ile tanimlaniyor. eb'nin de "EsyaBilgisi" nodlari var, eb.Elements("EsyaBilgisi") ile o donuyor. Bir tanesi ebs olarak isaret ediliyor. ebs'nin de elementleri var "KalemSiraNo", "EsyaKodu" gibi. Sonucta sen IEnumerable<anonymous> tipinde tasima objesini elde ediyorsun. Kabaca onun yapisi da:

    int SatirNo
    string KapCinsi
    IEnumerable<anonymous> EsyaBilgileri

    EsyaBilgileri de:

    int KalemSiraNo
    string EsyaKodu

    Avantaji daha sonra da istedigin gibi sorgulayip parcalayabilmen. Mesela sen sadece tasima.SatirNo = 1'in EsyaBilgilerini istiyorsan:

    var tasimaSorgu = tasima.Single(t => t.SatirNo == 1).EsyaBilgileri;

    Aslinda sen bu xml'ini etrafina <root> </root> koyarak bir dosyaya koysan (c:\temp\Sample.xml) ve LinqPad'de (linqPad.net - ucretsiz, ancak intellisense istersen ucret odemen gerekiyor) asagidaki kodu calistirsan daha iyi anlayacaksin. Bence Linq ile XDocument, XElement serisini kullan. Asagida LinqPad icin kod ve ciktisi:

    void Main()
    {
    XDocument content;
    using (StreamReader s = File.OpenText(@"c:\temp\Sample.xml"))
    {
      content = XDocument.Load(s);
    }
    var tasima = from t in content.Descendants("Tasima")
    select new {
      SatirNo = (int)t.Element("SatirNo"),
      KapCinsi = (string)t.Element("KapCinsi"),
      EsyaBilgileri = from eb in t.Elements("EsyaBilgileri")
                      from ebs in eb.Elements("EsyaBilgisi")
          select new {
            KalemSiraNo = (int)ebs.Element("KalemSiraNo"),
            EsyaKodu = (string)ebs.Element("EsyaKodu")
          }};
    
    var tasimaSorgu = tasima.Single (t => t.SatirNo == 1).EsyaBilgileri;
    tasimaSorgu.Dump();
    tasima.Dump();
    
    }
    

    5IEnumerable<> (2 items)
    KalemSiraNoΞΞ EsyaKodu

    1

    0101

    2

    0101

    3  

     

    5IEnumerable<> (2 items)
    SatirNoΞΞ KapCinsi EsyaBilgileri

    1

    BI

    5IEnumerable<> (2 items)
    KalemSiraNoΞΞ EsyaKodu

    1

    0101

    2

    0101

    3  

    2

    BI

    5IEnumerable<> (2 items)
    KalemSiraNoΞΞ EsyaKodu

    1

    0101

    2

    0101

    3  
    3    

     

    13 Ocak 2012 Cuma 11:47
    Yanıtlayıcı
  •  public void XmlFind()
        {
            //take an intance for object   
            DataSet dscompanies = new DataSet(); 
                //readin source xml file in memory
                dscompanies.ReadXml("D:\\MyXML.xml");
                
                DataView dvcompanies = new DataView(dscompanies.Tables["COMPANIES"]);
                try
                {
                    dvcompanies.Sort = "id";
                    int rowIndex = dvcompanies.Find(txtSearch.Text); // Find method will get parameter from search text
             
                
                string CompInCome, CompanyName, CompId; 
                if (rowIndex == -1)
                {
                    // The id has not found in our data
                    Response.Write("Product Not found");
                }
                else
                {
                    CompId = dvcompanies[rowIndex]["id"].ToString();
                    Response.Write("Company ID: " + CompId);
                    CompanyName = dvcompanies[rowIndex]["CompanyName"].ToString();
                    Response.Write(" CompanyName: " + CompanyName);
                    CompInCome = dvcompanies[rowIndex]["CompanyInCome"].ToString();
                    Response.Write(" CompanyInCome: " + CompInCome);
                }
                }
                catch (Exception ex)
                {
                    Response.Write("empty data cant search");
                }
        }
    bir arkadasa yadimci olmasi amaciyla yapmistim , textboxta girilen degerleri listeliyor tabi uyan degerleri . ingilizce anlatimlarin hatali olmus olabilir , kusura bakma :) umarim isine yarar 

    13 Ocak 2012 Cuma 12:09
  • öncelikle yardımlarınız için teşekkr ederim linq fazla bilmyrm ama aksam gidince bakarım ona Çetin Bey.

    Rıdvan bey sizin yaptığınız işlem de id ye göre sıralıyorsunuz sanırım id haricinde baska neye göre sıralanabilir benimkinde id ye göre degil de

    13 Ocak 2012 Cuma 13:20
  • erdm_28 selamlar,

     

    Yukarıdaki önerileri değerlendirebildiniz mi? Problemle ilgili son durumu paylaşır mısınız?

     

    İyi forumlar.


    Microsoft bu servisi kullanıcılarına yardım etme, Microsoft ürünleri ve teknolojileriyle ilgili bilgi bankasını genişletme amacıyla ücretsiz sunmaktadır.
    Bu içerik olduğu gibi benim tarafımdan hazırlanmış olup Microsoft tarafından herhangi bir sorumluluk üstlenildiği anlamına gelmez.
    Facebook Üzerinden Takip Et!
    Twitter'da Takip Et!

    17 Ocak 2012 Salı 07:18
    Moderatör