C#XML读取foreach始终是第一个值

时间:2018-06-22 16:43:30

标签: c# .net xml

我的XML

<?xml version="1.0" encoding="UTF-8"?>
 <teklif>
 <bilgiler>
<firma>Firma Adı</firma>
<aciklama>Açıklama</aciklama>
<isim>Ad Soyad</isim>
<telefon>Telefon</telefon>
<eposta>E Posta</eposta>
<urunler>
  <urun>
    <resimDosyasi>Dosya Seçilmedi</resimDosyasi>
    <aciklama>Ürün Açıklaması</aciklama>
    <birim>3,00</birim>
    <miktar>1</miktar>
    <toplam>0,00</toplam>
  </urun>
  <urun>
    <resimDosyasi>Dosya Seçilmedi</resimDosyasi>
    <aciklama>Ürün Açıklaması</aciklama>
    <birim>5,00</birim>
    <miktar>1</miktar>
    <toplam>0,00</toplam>
  </urun>
  <urun>
    <resimDosyasi>Dosya Seçilmedi</resimDosyasi>
    <aciklama>aas</aciklama>
    <birim>2,00</birim>
    <miktar>1</miktar>
    <toplam>0,00</toplam>
  </urun>
</urunler>

还有读取XML文件的My Function

        XmlDocument doc = new XmlDocument();
        doc.Load(filename);
        XmlNodeList xmllist = doc.SelectNodes("/teklif/bilgiler/urunler");
        foreach(XmlNode nod in xmllist)
        {
            foreach(XmlNode childNode in nod.ChildNodes)
            {
                // her ürünün childnode oldu

                    if(childNode.Name == "#text")
                    {
                    } else
                    {
                    var urun_resim = childNode.SelectSingleNode("//resimDosyasi").InnerText;
                    var urun_aciklama = childNode.SelectSingleNode("//aciklama").InnerText;
                    var urun_birim = childNode.SelectSingleNode("//birim").InnerText;
                    MessageBox.Show(urun_birim);
                    var urun_miktar = childNode.SelectSingleNode("//miktar").InnerText;
                    var urun_toplam = childNode.SelectSingleNode("//toplam").InnerText;
                    var urun = new Urun(urun_resim, urun_birim, urun_miktar, urun_aciklama);
                    lw_urunler.Items.Add(urun);

                    }
            }
        }

问题是当我在foreach循环中将// birim消息框输入时,它总是写第一个-3,00((3次)。如在XML中所看到的,第一个是3,00,第二个是5,00,第三个是2,00,但它总是写第一个。我检查了很多,但看不到问题。

4 个答案:

答案 0 :(得分:4)

尝试不使用//的情况,例如childNode.SelectSingleNode("birim")。两个正斜杠表示XML文档的根,我想它总是每次都从根开始查找第一个birim节点。

答案 1 :(得分:0)

使用xml linq:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Linq;

namespace ConsoleApplication52
{
    class Program
    {
        const string FILENAME = @"c:\temp\test.xml";
        static void Main(string[] args)
        {
            XDocument doc = XDocument.Load(FILENAME);

            List<urun> uruns = doc.Descendants("urun").Select(x => new urun() {
                resimDosyasi = (string)x.Element("resimDosyasi"),
                aciklama = (string)x.Element("aciklama"),
                birim = (string)x.Element("birim"),
                miktar = (int)x.Element("miktar"),
                toplam = (string)x.Element("toplam")
            }).ToList();

        }
    }
    public class urun
    {
        public string resimDosyasi { get; set; }
        public string aciklama { get; set; }
        public string birim { get; set; }
        public int miktar { get; set; }
        public string toplam { get; set; }
    }
}

答案 2 :(得分:0)

另一种可以提高代码的可读性和维护性的方法是将XML模式映射到对象模型中。

这样做,您可以轻松地按以下方式加载XML数据:

XmlSerializer serializer = new XmlSerializer(typeof(Teklif));
using (FileStream fileStream = new FileStream(filename, FileMode.Open))
{
     Teklif result = (Teklif)serializer.Deserialize(fileStream);
}

// Object model example
[XmlRoot("teklif")]
public class Teklif
{
    [XmlElement()]
    public bilgiler bilgiler { get; set; }
}

public class bilgiler
{
    [XmlElement()] public string firma { get; set; }
    [XmlElement()] public string aciklama { get; set; }
    [XmlElement()] public string isim { get; set; }
    [XmlElement()] public string telefon { get; set; }
    [XmlElement()] public string eposta { get; set; }

    [XmlArray()]
    [XmlArrayItem("urun")]
    public List<Urun> urunler { get; set; }
}

public class Urun
{
    [XmlElement()] public string resimDosyasi { get; set; }
    [XmlElement()] public string aciklama { get; set; }
    [XmlElement()] public string birim { get; set; }
    [XmlElement()] public int miktar { get; set; }
    [XmlElement()] public string toplam { get; set; }
}

答案 3 :(得分:0)

//表示选择节点,而不管它们在当前上下文中的位置。当前上下文默认为根。要将结果限制为当前子节点下的结果,请遵循以下模式(只需添加一个点):

g++ -shared -o mylib.so myobjs.o -fPIC -lstdc++ -lm -z defs -Wl,-soname,mylib -Wl,--no-as-needed -lpthread -lcrypto -lz