我设法使用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>
您必须使用适当的名称空间,rdf
不是属性名称的一部分,它是包含在其中的名称空间-您必须声明并使用名称空间-对于Linq到XML,这意味着使用XNamespace
-这很有效:
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>
):
var types = from variable in owlXML.Descendants("names")
where variable.Attribute(rdf +"ID") != null
select variable.Attribute(rdf + "ID").Value