none
讀取XML的圖檔 RRS feed

  • 問題

  • 我讀取test.xml這個檔裡的圖片資料,然後在C槽把圖創出來
    如果只有一張圖沒問題,但現在有兩張圖,請問該怎做呢,目前都只會創出第2張圖
    附上我的XML檔 

    XML檔

    try { int readbyte = 0; int bytestoread = 1044; int couct = 0; XmlTextReader xmltxtrd = new XmlTextReader(@"C:\test.xml"); FileStream fs = new FileStream(@"C:\test1.jpg", FileMode.Create); BinaryWriter bw = new BinaryWriter(fs); byte[] base64buffer = new byte[bytestoread]; while (xmltxtrd.Read()) { if (xmltxtrd.NodeType == XmlNodeType.Element && xmltxtrd.Name == "image") { do { readbyte = xmltxtrd.ReadBase64(base64buffer, 0, bytestoread); bw.Write(base64buffer, 0, readbyte); couct++; } while (bytestoread <= readbyte); } } bw.Flush(); bw.Close(); fs.Close(); xmltxtrd.Close(); MessageBox.Show("讀圖完成!"); } catch (Exception ex) { MessageBox.Show(ex.ToString()); }


    2013年11月11日 下午 01:53

解答

  • 您好,

    請問您是要將所有的圖放到同一個檔案之中嗎?

    還是各存一個檔呢?

    try
    {
    	int readbyte = 0;
    	int bytestoread = 1044;
    	int couct = 0;
    	XmlTextReader xmltxtrd = new XmlTextReader(@"h:\test5.xml");
    	int i = 0;
    	byte[] base64buffer = new byte[bytestoread];
    	while (xmltxtrd.Read())
    	{
    		if (xmltxtrd.NodeType == XmlNodeType.Element && xmltxtrd.Name == "image")
    		{
    			
    			FileStream fs = new FileStream(string.Format(@"h:\test{0}.jpg", i++), FileMode.Create);
    			BinaryWriter bw = new BinaryWriter(fs);
    			do
    			{
    				readbyte = xmltxtrd.ReadBase64(base64buffer, 0, bytestoread);
    				bw.Write(base64buffer, 0, readbyte); couct++;
    			}
    			while (bytestoread <= readbyte);
    			bw.Flush();
    			bw.Close();
    			fs.Close();
    		}
    	}
    	
    	xmltxtrd.Close();
    
    	MessageBox.Show("讀圖完成!");
    }
    catch (Exception ex)
    {
    	MessageBox.Show(ex.ToString());
    }

    因為您只有assign一個檔名! 然後就把xml中圖檔的資料一直往那個檔案裡去寫!


    亂馬客blog: http://www.dotblogs.com.tw/rainmaker/


    • 已編輯 亂馬客 2013年11月12日 上午 02:27
    • 已標示為解答 KikrW 2013年11月12日 上午 05:40
    2013年11月12日 上午 02:16
  • <?xml version="1.0" encoding="utf-8" standalone="yes"?>
    <公司>
      <所屬部門 Department="研發部">
        <Name>吳大寶</Name>
      </所屬部門>
      <所屬部門 Department="總務部">
        <Name>鄭小胖</Name>
      </所屬部門>
    </公司>
    var result = from item in XDocument.Load("YourFilename.xml").Descedants("所屬部門")
                          select new
                          {
                                   Department = item.Attribute("Department").Value,
                                   Name = item.Element("Name").Value
                          };


    For Account Validation, please follow "Verify Account+Number" at http://social.msdn.microsoft.com/Forums/en-us/home?forum=reportabug

    For ASP.NET Question, please ask at http://forums.asp.net

    For other questions, you can find a specific forum and then ask at http://stackexchange.com/sites

    Click and Donate at http://www.freerice.com

    • 已標示為解答 KikrW 2013年11月12日 上午 05:40
    2013年11月12日 上午 03:11
  • 您好,

    請參考

    http://stackoverflow.com/questions/11105603/reading-attribute-values-with-xmlreader

    XmlTextReader xmltxtrd = new XmlTextReader(@"h:\t2.xml");
    while (xmltxtrd.Read())
    {
    	switch (xmltxtrd.NodeType)
    	{
    		case XmlNodeType.Element:
    			Console.WriteLine(xmltxtrd.Name);
    			for (int attInd = 0; attInd < xmltxtrd.AttributeCount; attInd++)
    			{
    				xmltxtrd.MoveToAttribute(attInd);
    				Console.WriteLine(xmltxtrd.Name);
    				Console.WriteLine(xmltxtrd.Value);
    			}
    			break;
    		case XmlNodeType.Text:
    			Console.WriteLine(xmltxtrd.Value);
    			break;
    	}
    	
    }
    
    xmltxtrd.Close();


    不過取值的話,用XmlTextReader似乎比較不方便!

    用ThankfulHeart的那個方式比較方便哦!


    亂馬客blog: http://www.dotblogs.com.tw/rainmaker/



    • 已編輯 亂馬客 2013年11月12日 上午 05:14
    • 已標示為解答 KikrW 2013年11月12日 上午 05:39
    2013年11月12日 上午 04:40
  • KikrW:

    我的方法您尝试了吗?其实不一定需要用XmlReader方法,用XmlDocument完全可以方便达到目的:

    using System.Collections.Generic;
    using System.Xml;
    namespace CSharp
    {
        class Person
        {
            public string Department { get; set; }
            public string Name { get; set; }
        }
    
        class Program
        {
            static void Main(string[] args)
            {
                List<Person> people = new List<Person>();
                XmlDocument doc = new XmlDocument();
                doc.Load("XMLFile1.xml");
              XmlNodeList nodeList =  doc.SelectNodes("//所屬部門");
              foreach (XmlNode item in nodeList)
              {
                  Person p = new Person();
                  p.Department = item.Attributes["Department"].InnerText;
                  p.Name = item.ChildNodes[0].InnerText;
                  people.Add(p);
              }
              foreach (var item in people)
              {
                  System.Console.WriteLine(item.Department+"<==>"+item.Name);
              }
            }
        }

    For Account Validation, please follow "Verify Account+Number" at http://social.msdn.microsoft.com/Forums/en-us/home?forum=reportabug

    For ASP.NET Question, please ask at http://forums.asp.net

    For other questions, you can find a specific forum and then ask at http://stackexchange.com/sites

    Click and Donate at http://www.freerice.com

    • 已編輯 ThankfulHeart 2013年11月12日 上午 05:25
    • 已標示為解答 KikrW 2013年11月12日 上午 05:40
    2013年11月12日 上午 04:46
  • kilkrW:

    如果您使用的是net framework2.0專案,那麼嘗試這個:

    using System.Collections.Generic;
    using System.Xml;
    namespace CSharp
    {
        class Person
        {
            public string Department { get; set; }
            public string Name { get; set; }
        }
    
        class Program
        {
            static void Main(string[] args)
            {
                XmlTextReader reader = new XmlTextReader("XMLFile1.xml");
                List<Person> persons = new List<Person>();
    
                //標示符
                int pointer = 0;
    
                while (reader.Read())
                {
                    Person p = null;
    
                    if(reader.NodeType==XmlNodeType.Element && reader.LocalName=="所屬部門")
                    {
                        p = new Person();
                        p.Department = reader.GetAttribute("Department");
                        persons.Add(p);
                    }
                    if(reader.NodeType==XmlNodeType.Element && reader.LocalName=="Name")
                    {
                        persons[pointer++].Name = reader.ReadString();
                    }
                }
    
                //專案列出
                foreach (var item in persons)
                {
                    System.Console.WriteLine(item.Department+"<===>"+item.Name);
                }
            }
        }
    }

    For Account Validation, please follow "Verify Account+Number" at http://social.msdn.microsoft.com/Forums/en-us/home?forum=reportabug

    For ASP.NET Question, please ask at http://forums.asp.net

    For other questions, you can find a specific forum and then ask at http://stackexchange.com/sites

    Click and Donate at http://www.freerice.com

    • 已標示為解答 KikrW 2013年11月12日 上午 05:40
    2013年11月12日 上午 05:19
  • kilkrW:

    總共提供了3個方法,您一一嘗試。

    您可以模仿我第二或者第三個專案示例代碼進行訊息實作存儲,之後列印,謝謝!


    For Account Validation, please follow "Verify Account+Number" at http://social.msdn.microsoft.com/Forums/en-us/home?forum=reportabug

    For ASP.NET Question, please ask at http://forums.asp.net

    For other questions, you can find a specific forum and then ask at http://stackexchange.com/sites

    Click and Donate at http://www.freerice.com

    • 已標示為解答 KikrW 2013年11月12日 上午 05:39
    2013年11月12日 上午 05:30

所有回覆

  • 有兩張圖的話請用迴圈...

    強力監督SQL Injection問題!!

      • 小朱的技術隨手寫:http://www.dotblogs.com.tw/regionbbs/
      • 雲端學堂Facebook: http://www.facebook.com/studyazure

    2013年11月11日 下午 02:14
    版主
  • 您好,昨天才剛接觸到XML

    目前寫法都是參考網路上的資料

    就我自己的認知

    if (xmltxtrd.NodeType == XmlNodeType.Element && xmltxtrd.Name == "image")

    這行不就是判斷 如果是Element且名稱是image,就去做轉換的動作

    這樣我的XML檔裡有兩個image,不是應該兩個也都會讀到嗎?

    但卻只會轉換出第2張,第一張反而不會轉換,

    請問是哪裡出問題呢? 謝謝!!

    2013年11月12日 上午 12:54
  • 您好,

    請問您是要將所有的圖放到同一個檔案之中嗎?

    還是各存一個檔呢?

    try
    {
    	int readbyte = 0;
    	int bytestoread = 1044;
    	int couct = 0;
    	XmlTextReader xmltxtrd = new XmlTextReader(@"h:\test5.xml");
    	int i = 0;
    	byte[] base64buffer = new byte[bytestoread];
    	while (xmltxtrd.Read())
    	{
    		if (xmltxtrd.NodeType == XmlNodeType.Element && xmltxtrd.Name == "image")
    		{
    			
    			FileStream fs = new FileStream(string.Format(@"h:\test{0}.jpg", i++), FileMode.Create);
    			BinaryWriter bw = new BinaryWriter(fs);
    			do
    			{
    				readbyte = xmltxtrd.ReadBase64(base64buffer, 0, bytestoread);
    				bw.Write(base64buffer, 0, readbyte); couct++;
    			}
    			while (bytestoread <= readbyte);
    			bw.Flush();
    			bw.Close();
    			fs.Close();
    		}
    	}
    	
    	xmltxtrd.Close();
    
    	MessageBox.Show("讀圖完成!");
    }
    catch (Exception ex)
    {
    	MessageBox.Show(ex.ToString());
    }

    因為您只有assign一個檔名! 然後就把xml中圖檔的資料一直往那個檔案裡去寫!


    亂馬客blog: http://www.dotblogs.com.tw/rainmaker/


    • 已編輯 亂馬客 2013年11月12日 上午 02:27
    • 已標示為解答 KikrW 2013年11月12日 上午 05:40
    2013年11月12日 上午 02:16
  • 謝謝亂馬的回答~!! 我在來去研究一下!!

    再請問一下~我一直被屬性搞混~!!!

    像我的xml檔案如下,我要取出吳大寶、鄧小胖

    用XmlTextReader該怎做呢?!

    <?xml version="1.0" encoding="utf-8" standalone="yes"?>
    <公司>
      <所屬部門 Department="研發部">
        <Name>吳大寶</Name>
      </所屬部門>
      <所屬部門 Department="總務部">
        <Name>鄭小胖</Name>
      </所屬部門>
    </公司>

    2013年11月12日 上午 02:58
  • KikrW:

    您好,您的framework版本是多少的?


    For Account Validation, please follow "Verify Account+Number" at http://social.msdn.microsoft.com/Forums/en-us/home?forum=reportabug

    For ASP.NET Question, please ask at http://forums.asp.net

    For other questions, you can find a specific forum and then ask at http://stackexchange.com/sites

    Click and Donate at http://www.freerice.com

    2013年11月12日 上午 03:00
  • 我是安裝Microsoft Visual Studio 2012
    2013年11月12日 上午 03:04
  • <?xml version="1.0" encoding="utf-8" standalone="yes"?>
    <公司>
      <所屬部門 Department="研發部">
        <Name>吳大寶</Name>
      </所屬部門>
      <所屬部門 Department="總務部">
        <Name>鄭小胖</Name>
      </所屬部門>
    </公司>
    var result = from item in XDocument.Load("YourFilename.xml").Descedants("所屬部門")
                          select new
                          {
                                   Department = item.Attribute("Department").Value,
                                   Name = item.Element("Name").Value
                          };


    For Account Validation, please follow "Verify Account+Number" at http://social.msdn.microsoft.com/Forums/en-us/home?forum=reportabug

    For ASP.NET Question, please ask at http://forums.asp.net

    For other questions, you can find a specific forum and then ask at http://stackexchange.com/sites

    Click and Donate at http://www.freerice.com

    • 已標示為解答 KikrW 2013年11月12日 上午 05:40
    2013年11月12日 上午 03:11
  • 該怎做才能顯示出 Department 跟研發部呢


    用if (xmltxtrd.NodeType == XmlNodeType.Attribute)這一行完全跳不進去


    XmlTextReader xmltxtrd = new XmlTextReader(.xml);
    
                while (xmltxtrd.Read())
                {
                     if (xmltxtrd.NodeType == XmlNodeType.Attribute){....}
                    
                }


    2013年11月12日 上午 03:51
  • 您好,

    請參考

    http://stackoverflow.com/questions/11105603/reading-attribute-values-with-xmlreader

    XmlTextReader xmltxtrd = new XmlTextReader(@"h:\t2.xml");
    while (xmltxtrd.Read())
    {
    	switch (xmltxtrd.NodeType)
    	{
    		case XmlNodeType.Element:
    			Console.WriteLine(xmltxtrd.Name);
    			for (int attInd = 0; attInd < xmltxtrd.AttributeCount; attInd++)
    			{
    				xmltxtrd.MoveToAttribute(attInd);
    				Console.WriteLine(xmltxtrd.Name);
    				Console.WriteLine(xmltxtrd.Value);
    			}
    			break;
    		case XmlNodeType.Text:
    			Console.WriteLine(xmltxtrd.Value);
    			break;
    	}
    	
    }
    
    xmltxtrd.Close();


    不過取值的話,用XmlTextReader似乎比較不方便!

    用ThankfulHeart的那個方式比較方便哦!


    亂馬客blog: http://www.dotblogs.com.tw/rainmaker/



    • 已編輯 亂馬客 2013年11月12日 上午 05:14
    • 已標示為解答 KikrW 2013年11月12日 上午 05:39
    2013年11月12日 上午 04:40
  • KikrW:

    我的方法您尝试了吗?其实不一定需要用XmlReader方法,用XmlDocument完全可以方便达到目的:

    using System.Collections.Generic;
    using System.Xml;
    namespace CSharp
    {
        class Person
        {
            public string Department { get; set; }
            public string Name { get; set; }
        }
    
        class Program
        {
            static void Main(string[] args)
            {
                List<Person> people = new List<Person>();
                XmlDocument doc = new XmlDocument();
                doc.Load("XMLFile1.xml");
              XmlNodeList nodeList =  doc.SelectNodes("//所屬部門");
              foreach (XmlNode item in nodeList)
              {
                  Person p = new Person();
                  p.Department = item.Attributes["Department"].InnerText;
                  p.Name = item.ChildNodes[0].InnerText;
                  people.Add(p);
              }
              foreach (var item in people)
              {
                  System.Console.WriteLine(item.Department+"<==>"+item.Name);
              }
            }
        }

    For Account Validation, please follow "Verify Account+Number" at http://social.msdn.microsoft.com/Forums/en-us/home?forum=reportabug

    For ASP.NET Question, please ask at http://forums.asp.net

    For other questions, you can find a specific forum and then ask at http://stackexchange.com/sites

    Click and Donate at http://www.freerice.com

    • 已編輯 ThankfulHeart 2013年11月12日 上午 05:25
    • 已標示為解答 KikrW 2013年11月12日 上午 05:40
    2013年11月12日 上午 04:46
  • kilkrW:

    如果您使用的是net framework2.0專案,那麼嘗試這個:

    using System.Collections.Generic;
    using System.Xml;
    namespace CSharp
    {
        class Person
        {
            public string Department { get; set; }
            public string Name { get; set; }
        }
    
        class Program
        {
            static void Main(string[] args)
            {
                XmlTextReader reader = new XmlTextReader("XMLFile1.xml");
                List<Person> persons = new List<Person>();
    
                //標示符
                int pointer = 0;
    
                while (reader.Read())
                {
                    Person p = null;
    
                    if(reader.NodeType==XmlNodeType.Element && reader.LocalName=="所屬部門")
                    {
                        p = new Person();
                        p.Department = reader.GetAttribute("Department");
                        persons.Add(p);
                    }
                    if(reader.NodeType==XmlNodeType.Element && reader.LocalName=="Name")
                    {
                        persons[pointer++].Name = reader.ReadString();
                    }
                }
    
                //專案列出
                foreach (var item in persons)
                {
                    System.Console.WriteLine(item.Department+"<===>"+item.Name);
                }
            }
        }
    }

    For Account Validation, please follow "Verify Account+Number" at http://social.msdn.microsoft.com/Forums/en-us/home?forum=reportabug

    For ASP.NET Question, please ask at http://forums.asp.net

    For other questions, you can find a specific forum and then ask at http://stackexchange.com/sites

    Click and Donate at http://www.freerice.com

    • 已標示為解答 KikrW 2013年11月12日 上午 05:40
    2013年11月12日 上午 05:19
  • 您好,您的方法正在嘗試

    我在每個方法都試用看看! 謝謝!

    對了~那搜尋完後 該如何印出來呢?

    var result = from item in XDocument.Load("YourFilename.xml").Descedants("所屬部門")
                          select new
                          {
                                   Department = item.Attribute("Department").Value,
                                   Name = item.Element("Name").Value
                          };

    2013年11月12日 上午 05:29
  • kilkrW:

    總共提供了3個方法,您一一嘗試。

    您可以模仿我第二或者第三個專案示例代碼進行訊息實作存儲,之後列印,謝謝!


    For Account Validation, please follow "Verify Account+Number" at http://social.msdn.microsoft.com/Forums/en-us/home?forum=reportabug

    For ASP.NET Question, please ask at http://forums.asp.net

    For other questions, you can find a specific forum and then ask at http://stackexchange.com/sites

    Click and Donate at http://www.freerice.com

    • 已標示為解答 KikrW 2013年11月12日 上午 05:39
    2013年11月12日 上午 05:30
  • kikrW:

    我最後一個訊息只是提示你而已,這個不必標記答案了。呵呵。


    For Account Validation, please follow "Verify Account+Number" at http://social.msdn.microsoft.com/Forums/en-us/home?forum=reportabug

    For ASP.NET Question, please ask at http://forums.asp.net

    For other questions, you can find a specific forum and then ask at http://stackexchange.com/sites

    Click and Donate at http://www.freerice.com

    2013年11月12日 上午 05:45