Cᴏʀ*_*ᴏʀʏ 3 .net c# xml xpath xml-namespaces
我正在尝试从严格命名的XML文档中查询一些信息,并且在查找也是命名空间的属性时遇到了一些麻烦.
XML看起来像:
<?xml version="1.0" encoding="utf-8" ?>
<rdf:RDF
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#"
xmlns:owl="http://www.w3.org/2002/07/owl#"
xmlns:skos="http://www.w3.org/2004/02/skos/core#"
xmlns:geo="http://www.geonames.org/ontology#"
xmlns:dc="http://purl.org/dc/terms/"
xmlns:foaf="http://xmlns.com/foaf/0.1/"
xmlns:void="http://rdfs.org/ns/void#">
<geo:Country rdf:about="http://ontologi.es/place/AD" skos:notation="AD" rdfs:label="Andorra" />
<geo:Country rdf:about="http://ontologi.es/place/AE" skos:notation="AE" rdfs:label="United Arab Emirates" />
<geo:Country rdf:about="http://ontologi.es/place/AF" skos:notation="AF" rdfs:label="Afghanistan" />
<geo:Country rdf:about="http://ontologi.es/place/AG" skos:notation="AG" rdfs:label="Antigua & Barbuda" />
<geo:Country rdf:about="http://ontologi.es/place/AI" skos:notation="AI" rdfs:label="Anguilla" />
<geo:Country rdf:about="http://ontologi.es/place/AL" skos:notation="AL" rdfs:label="Albania" />
...
</rdf:RDF>
Run Code Online (Sandbox Code Playgroud)
我的目标是创建一个包含国家/地区代码和国家/地区名称的对象列表.这对我现在有用:
XmlReader reader = XmlReader.Create(@"path/to/xml.xml");
XDocument root = XDocument.Load(reader);
XmlNameTable nameTable = reader.NameTable;
XmlNamespaceManager nsManager = new XmlNamespaceManager(nameTable);
nsManager.AddNamespace("rdf", "http://www.w3.org/1999/02/22-rdf-syntax-ns#");
nsManager.AddNamespace("rdfs", "http://www.w3.org/2000/01/rdf-schema#");
nsManager.AddNamespace("skos", "http://www.w3.org/2004/02/skos/core#");
nsManager.AddNamespace("geo", "http://www.geonames.org/ontology#");
var geoCountries =
from country in root.XPathSelectElements("./rdf:RDF/geo:Country", nsManager)
select new {
CountryCode = country.Attributes("{http://www.w3.org/2004/02/skos/core#}notation").First().Value,
CountryName = country.Attributes("{http://www.w3.org/2000/01/rdf-schema#}label").First().Value
};
Run Code Online (Sandbox Code Playgroud)
这工作正常,但我想使用命名空间别名找到属性,而不是命名空间URI(只是因为),或者至少能够使用别名查找URI.为了尝试后一种想法,我最终想通了我可以做到这一点:
country.Attributes(nsManager.LookupNamespace("skos") + "notation").First().Value
Run Code Online (Sandbox Code Playgroud)
但我得到一个XmlException
:':'字符,十六进制值0x3A,不能包含在名称中.
那么我试过:
country.Attributes("{" + nsManager.LookupNamespace("skos") + "}notation").First().Value
Run Code Online (Sandbox Code Playgroud)
然后它工作,但似乎有可能或应该是一个更简单的方式,或者更确切地说,{namespace}attribute
语法对我来说似乎很愚蠢,就像可能在框架中抽象出来的东西.
我很感激任何反馈.谢谢!
使用Linq到xml
XNamespace skos = XNamespace.Get("http://www.w3.org/2004/02/skos/core#");
XNamespace geo = XNamespace.Get("http://www.geonames.org/ontology#");
XNamespace rdfs = XNamespace.Get("http://www.w3.org/2000/01/rdf-schema#");
XDocument rdf = XDocument.Load(new StringReader(xmlstr));
foreach(var country in rdf.Descendants(geo + "Country"))
{
Console.WriteLine(
country.Attribute(skos + "notation").Value + " " +
country.Attribute(rdfs + "label").Value );
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
4951 次 |
最近记录: |