Как я могу проанализировать файл OWL (содержащий пространства имен RDF) с помощью LINQ

#c# #xml #linq #.net-3.5 #owl

#c# #xml #linq #.net-3.5 #owl

Вопрос:

Мне удалось проанализировать простой XML-файл с помощью LINQ и записать его в список, но когда я попытался получить значения из файла 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:

Вы должны использовать соответствующее пространство имен, rdf не является частью имени атрибута, это пространство имен, в котором оно содержится — вы должны объявить и использовать пространство имен — для Linq to 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