如何使用LINQ解析OWL文件(包含RDF命名空间)

时间:2011-05-30 18:12:07

标签: c# xml linq .net-3.5 owl

我设法使用LINQ解析一个简单的XML文件并将其写入列表框,但是当我尝试从OWL文件中获取值时,查询没有得到任何结果,所以“变量”是空。这是我尝试做的一件事:

 XDocument owlXML = XDocument.Load(Server.MapPath("App_Data\\filename.owl"));

    var variables = from variable in owlXML.Descendants("names")
                   where variable.Attribute("rdf:ID") != null
                   select new 
                   { 
                      type = tog.Attribute("rdf:ID").Value
                   };

   ListBox1.DataSource = clothes;
   ListBox1.DataBind();

OWL文件

<rdf:RDF
 xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
 ...
 ...
 xml:base="http://www.owl-ontologies.com/Ontology1299428518.owl">
 <owl:Ontology rdf:about=""/>
 <owl:Class rdf:ID="animal"/>
 <owl:Class rdf:ID="natural_disaster">
   <rdfs:subClassOf>
     <owl:Class rdf:ID="disaster"/>
   </rdfs:subClassOf>
   <rdfs:subClassOf>
     <owl:Class rdf:ID="natural_phenomenon"/>
   </rdfs:subClassOf>
 </owl:Class>

 <names rdf:ID="New York"/>
 <names rdf:ID="Washington"/>
 <names rdf:ID="Sofia"/>
 <names rdf:ID="Miami"/>
</rdf:RDF>

1 个答案:

答案 0 :(得分:2)

您必须使用适当的命名空间,rdf不是属性名称的一部分,它是包含在其中的命名空间 - 您必须声明并使用命名空间 - 对于Linq to XML,这意味着使用{ {3}} - 这有效:

XDocument owlXML = XDocument.Load("test.xml");
XNamespace rdf = "http://www.w3.org/1999/02/22-rdf-syntax-ns#";

var variables = from variable in owlXML.Descendants("names")
                where variable.Attribute(rdf +"ID") != null
                select new
                {
                    type = variable.Attribute(rdf + "ID").Value
                };

确保代码中命名空间的值完全匹配在XML中声明它的方式。

此外,由于您只有一个您感兴趣的值,因此您不必在此处使用匿名类型,您可以通过直接返回字符串来简化(types然后将IEnumerable<string>):< / p>

var types = from variable in owlXML.Descendants("names")
            where variable.Attribute(rdf +"ID") != null
            select variable.Attribute(rdf + "ID").Value