2010-07-12 177 views
-1

我一直在這個工作了幾天,我無法弄清楚。我是新來的XML和解析,但我能夠從網站檢索bmml數據,我想能夠從bmml文件中提取圖像文件名稱。我嘗試使用XPath,但它似乎並不奏效。解析一個bmml文件

bmml:bmml xmlns="http://www.X.com/2002/bmml" xmlns:bmml="http://www.X.com/2002/bmml" xmlns:cg="http://www.X.com/2002/cg" xmlns:ctrl="http://www.X.com/2002/control" xmlns:geo="http://www.X.com/2002/geometry" xmlns:res="http://www.X.com/2002/resource" xmlns:lyr="http://www.X.com/2002/lyric" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
- <bmml:context name="ctx1"> 
- <bmml:devices> 
    <bmml:device xsi:type="cg:character-generator" name="dev1" /> 
    </bmml:devices> 
- <bmml:resources resourceCount="100" totalCount="492"> 
- <bmml:resource name="image0" moniker="ABC Australia Logo" context="NEWSRED" uuid="FD076559-97F1-4B7A-BD99-864E0A99A7D6" xsi:type="res:image" format="tga" width="0" height="0"> 
    <bmml:title>ABC Australia Logo.tga</bmml:title> 
    <bmml:description /> 
    <bmml:keywords /> 
    <bmml:asset-class>4</bmml:asset-class> 
    <bmml:author>/X</bmml:author> 
    <bmml:version /> 
    <bmml:subject /> 
    <bmml:filename>..\ABC Australia Logo.tga</bmml:filename> 
    <bmml:filesize>8294418</bmml:filesize> 
    <bmml:url>NEWSRED/images/FD076559-97F1-4B7A-BD99-864E0A99A7D6.tga</bmml:url> 
    <bmml:alpha>true</bmml:alpha> 
    <bmml:created>1274893542000</bmml:created> 
    <bmml:modified>1274893542000</bmml:modified> 
    <bmml:accessed>1277933686000</bmml:accessed> 
- <bmml:proxy name="proxy0" class="thumbnail" xsi:type="res:image" height="0" width="0"> 
    **<bmml:url>NEWSRED/images/FD076559-97F1-4B7A-BD99-864E0A99A7D6/thumbnail.jpg</bmml:url>** 
    </bmml:proxy> 
- <bmml:proxy name="proxy1" class="asset" xsi:type="res:image" height="0" width="0"> 
    <bmml:url>NEWSRED/images/FD076559-97F1-4B7A-BD99-864E0A99A7D6/asset.jpg</bmml:url> 
    </bmml:proxy> 
    </bmml:resource> 
+2

你忘了發佈的三件事,以便我們可以有一個討論的基礎:一個'bmml'文件的例子,這個文件的確切部分,你試圖提取和你到目前爲止嘗試過的代碼我的意思是,不只是說你已經嘗試過'XPath')。現在我認爲你可以添加第四件事:最終的錯誤信息或從代碼中獲得的錯誤結果,而不是說它「看起來不工作」。 – 2010-07-12 20:13:48

+0

好吧,我試着在網上跟着一堆XPath教程,而且他們沒有人能夠正確解析bmml。 – Katianie 2010-07-12 20:21:09

+0

@Katianie,你的評論並沒有真正給我們帶來更多的幫助。看到我的第一個評論,瞭解爲什麼。 – 2010-07-12 20:22:40

回答

1

下面是一個使用該XPathSelectElements擴展方法,並在文件中檢索所有bmml:url值的示例:

using System; 
using System.Xml; 
using System.Xml.Linq; 
using System.Xml.XPath; 

class Program 
{ 
    static void Main() 
    { 
     var doc = XDocument.Load("test.xml"); 
     var nsmgr = new XmlNamespaceManager(new NameTable()); 
     nsmgr.AddNamespace("bmml", "http://www.X.com/2002/bmml"); 
     var urls = doc.XPathSelectElements("//bmml:url", nsmgr); 
     foreach (var url in urls) 
     { 
      Console.WriteLine(url.Value); 
     } 
    } 
} 

你會發現一個namespace manager的使用,使正確執行XPath查詢。


UPDATE:

看來,XPathSelectElements擴展方法的使用並不像我想最初那樣明顯。事情以確保:

  1. 你的項目的目標是.NET 3.5或更高版本
  2. 你所引用的System.Xml.Linq.dll組件項目
  3. 你才能把extension method進入範圍添加using System.Xml.XPath
+0

當你說XDocument你meen XmlDocument或XPathDocument。我也找不到XPathSelectElements。 – Katianie 2010-07-12 20:55:06

+0

不,XDocument的意思是,好吧,'XDocument'(http://msdn.microsoft.com/en-us/library/system.xml.linq.xdocument.aspx)。它不是指'XmlDocument'和'XPathDocument'。順便說一下,這與這些課程無關。至於'XPathSelectElements'方法,它是'System.Xml.Linq程序集'中'System.Xml.XPath'命名空間中定義的擴展方法。閱讀文檔(我提供的鏈接)並使用正確的用法並參考適當的程序集。 – 2010-07-12 20:58:25

0

不知道如果該XML數據是否形成良好(人們會希望)。但是,如果其他所有函數都以字符串讀取器打開並用xml替換bmml:bmml。不知道這是否會工作,我可能會遠離基地...我相信達林有一個很好的解決方案,雖然使用linq和.net 3.5的要求可能不適合你。

:)〜祝你好運。