2012-04-27 40 views
0

我想從我的XML文件,從XML文件中讀取一些數據在C#中從XMLFILE

名稱/姓名/ trckid

  • 1)例如像一個粘貼的閱讀一定值下面我想 讀名稱/姓名/ trckid
    例如:trckid = FF7eb01f7-7985-47b1-8f8c-a0e92395d00f

  • 2)以及名稱/姓名/文件/文件/ URI其中formatCode =「2001 「
    例如生成的字符串:URI = HTTP://cont.catalog.address.xyz.com/e2/ds/9b660964.jpg

這裏是我的示例XML文件

<?xml version="1.0" encoding="utf-8"?> 
<Names tracking="trckids" execTime="0" xmlns="urn:schemas-microsoft-com:address:catalog"> 
    <Name xmlns="urn:schemas-microsoft-com:address:catalog" publishState="Published" lcid="1033" options="0" version="65" filterFlags="32687"> 
     <trckid ref="5ofol35" seoMetaData="/xyz/gpscatalog/">FF7eb01f7-7985-47b1-8f8c-a0e92395d00f</trckid> 
     <providerId>Test0_2286326_304163829</providerId> 
     <files> 
      <file formatCode="2001" gpsFileId="9B660964-1626-466C-8359-F036506D8769" height="102" width="136" fileHash="4a4bcceb08b4ccdd16a958e8687c9588"> 
       <uri>http://cont.catalog.address.xyz.com/e2/ds/9b660964-1626-466c-8359-f036506d8769.jpg</uri> 
      </file> 
      <file formatCode="2007"> 
       <uri>http://img1.catalog.address.xyz.com/image.aspx?uuid=d7eb01f7-7985-47b1-8f8c-a0e92395d00f&amp;w=136&amp;h=102</uri> 
      </file> 
      <file formatCode="2200" gpsFileId="6C34F723-D798-4DA8-AEE4-0442C239D3A0" fileSize="311469" height="180" width="320"                    sourceFileHash="6ea74770f622e3e0dc9cf5e229c7de7f"> 
       <uri>http://cont.catalog.address.xyz.com/e2/ds/0909a015-4b6a-4574-be63-c2facd527b9f_0.xml</uri> 
      </file> 
     </files> 
    </Name> 
    <Name xmlns="urn:schemas-microsoft-com:address:catalog" publishState="Published" lcid="1033" options="0" version="65" filterFlags="32687"> 
     <trckid ref="5ofol20" seoMetaData="/xyz/gpscatalog/">FF9eb01f7-7985-47b1-8f8c-a0e92395d00f</trckid> 
     <providerId>Test1TheLorax_2286326_304163829</providerId> 
     <files> 
      <file formatCode="2001" gpsFileId="9B660964-1626-466C-8359-F036506D8769" height="102" width="136" fileHash="4a4bcceb08b4ccdd16a958e8687c9588"> 
       <uri>http://cont.catalog.address.xyz.com/e2/ds/9b660964-1626-466c-8359-f036506d8769.jpg</uri> 
      </file> 
      <file formatCode="2007"> 
       <uri>http://img1.catalog.address.xyz.com/image.aspx?uuid=d7eb01f7-7985-47b1-8f8c-a0e92395d00f&amp;w=136&amp;h=102</uri> 
      </file> 
      <file formatCode="2200" gpsFileId="6C34F723-D798-4DA8-AEE4-0442C239D3A0" fileSize="311469" height="180" width="320"                    sourceFileHash="6ea74770f622e3e0dc9cf5e229c7de7f"> 
       <uri>http://cont.catalog.address.xyz.com/e2/ds/0909a015-4b6a-4574-be63-c2facd527b9f_0.xml</uri> 
      </file> 
     </files> 
    </Name> 
</Names> 

我試着與下面給出一段代碼

 XDocument xdoc = XDocument.Parse(xmlstring); 
      XNamespace ns = xdoc.Root.GetDefaultNamespace(); // "urn:schemas-microsoft-com:msnvideo:catalog"; 
      IEnumerable<XElement> names = xdoc.Descendants(ns + "name"); 
    foreach (XElement name in names) 
      { 


       rssFeedItems.Add(new Adressses 
        { 
        trackid= Convert.ToString(name.Element(ns + "trackid").Value), 
        providerID= Convert.ToString(name.Element(ns + "provideid").Value), 

        imageUri = Convert.ToString(name.Element(ns + "uri").Value) 
        }); 

      }   
    Here am able to read first two items ,ie, trackid and providerID ,but not the image uri 

我需要閱讀匹配的名稱/姓名/文件/文件@ formatcode [2001]/URI的URI

imageUri = Convert.ToString(name.Element(ns + "Names/Name/files/[email protected][2001]/uri").Value) 

但這只是不起作用。請幫助

+2

感謝您的信息。問題在哪裏?你試過什麼了? – walther 2012-04-27 00:16:49

+0

我添加了更多信息 – Millar 2012-04-27 00:35:56

回答

2

首先,您的xml無效。結束標籤應該看起來像這樣</Names>而不是<Names/>

其次,您必須添加命名空間聲明。就像這樣:

XNamespace cat = "urn:schemas-microsoft-com:address:catalog"; 
    XNamespace add = "urn:schemas-microsoft-com:msnvideo:address"; 
    XDocument doc = XDocument.Parse(xdata); 
    var firstTrck = doc.Element(cat + "Names").Elements(add + "Name").First().Element(add + "trckid"); 
    var val = firstTrck.Value; 

另外值得注意,細心的你如何追加(或多個)元/片,以確保你正在尋找一個或多個元素。

以下是如何遍歷您的元素集合:

 XNamespace cat = "urn:schemas-microsoft-com:address:catalog"; 
     XNamespace add = "urn:schemas-microsoft-com:msnvideo:address"; 
     XDocument doc = XDocument.Parse(xdata); 

     var xNames = doc.Element(cat + "Names").Elements(add + "Name"); 
     foreach (var xName in xNames) 
     { 
      var trackingId = xName.Element(add + "trckid").Value; 

      var xFiles = xName.Element(add + "files").Elements(add + "file").Where(xe => (string)xe.Attribute("formatCode") == "2001"); 
      foreach (var xFile in xFiles) 
      { 
       var uri = xFile.Element(add + "uri").Value; 
      } 
     } 

請注意,當您調試這個只有「名稱」的元素之一出現在收藏。這是因爲xmlns聲明不符合每個聲明。

-1

爲什麼你不只是將每一行讀入一個字符串數組,然後搜索一個包含你正在尋找的前綴的行。剝離它的正面和背面,並將其存儲在一個變量中。這對於你的工作?

+0

它可能不適用於xml。並非所有節點都在一條線上。我認爲xml必須用路徑解析。 – 2012-04-27 00:25:18

+0

啊,是的,我看到這可能是一個問題..哦,只是一個新手在這裏試圖伸出援助之手回到社區,幫助我設計我的第一對夫婦的應用程序=) – Ceranas 2012-04-27 00:35:45

1

我認爲這會做你想要的。

XmlDocument doc = new XmlDocument(); 
WebClient webClient = new WebClient(); 
string xmlstring = webClient.DownloadString(url); 
doc.LoadXml(xmlstring); 
XmlNamespaceManager nsMgr = new XmlNamespaceManager(doc.NameTable); 
nsMgr.AddNamespace("ns", "urn:schemas-microsoft-com:address:catalog"); 
foreach (XmlNode n in doc.SelectNodes("/ns:Names/ns:Name/ns:trckid/@ref", nsMgr)) 
{ 
    Console.WriteLine(String.Format("trckid: {0}", n.InnerText)); 
} 
foreach (XmlNode n in doc.SelectNodes("/ns:Names/ns:Name/ns:files/ns:file[@formatCode='2001']/ns:uri", nsMgr)) 
{ 
    Console.WriteLine(String.Format("uri: {0}", n.InnerText)); 
}