2010-07-12 170 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的要求可能不适合你。

:)〜祝你好运。