读取具有多个名称空间的XML文件

我有一个包含多个命名空间的XML文件。 但我无法从任何节点获取值/文本。

   2.0 OIOUBL-2.02 Procurement-BilSim-1.0 88481 2012-05-21 380 DKK   ZZ 36433 2012-05-21   

我正在尝试阅读一些节点,但我不能。 这是一个例子。

 XmlDocument doc = new XmlDocument(); doc.Load(@"C:\temp\88481.xml"); XmlNamespaceManager manager = new XmlNamespaceManager(doc.NameTable); manager.AddNamespace("cbc", "urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-2"); manager.AddNamespace("cac", "urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-2"); manager.AddNamespace("qdt", "urn:oasis:names:specification:ubl:schema:xsd:QualifiedDatatypes-2"); manager.AddNamespace("xsd", "http://www.w3.org/2001/XMLSchema"); manager.AddNamespace("udt", "urn:un:unece:uncefact:data:specification:UnqualifiedDataTypesSchemaModule:2"); manager.AddNamespace("ccts", "urn:un:unece:uncefact:documentation:2"); manager.AddNamespace("ext", "urn:oasis:names:specification:ubl:schema:xsd:CommonExtensionComponents-2"); manager.AddNamespace("", "urn:oasis:names:specification:ubl:schema:xsd:Invoice-2"); XmlNodeList list = doc.SelectNodes("//Invoice/cbc:ID", manager); 

但节点列表没有元素?

你第一次真的很亲密。

与Jon Skeet一样,“Invoice”是根元素,因此您无需声明新的命名空间。

 XmlDocument doc = new XmlDocument(); doc.Load(@"C:\temp\88481.xml"); XmlNamespaceManager manager = new XmlNamespaceManager(doc.NameTable); manager.AddNamespace("cbc", "urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-2"); manager.AddNamespace("cac", "urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-2"); manager.AddNamespace("qdt", "urn:oasis:names:specification:ubl:schema:xsd:QualifiedDatatypes-2"); manager.AddNamespace("xsd", "http://www.w3.org/2001/XMLSchema"); manager.AddNamespace("udt", "urn:un:unece:uncefact:data:specification:UnqualifiedDataTypesSchemaModule:2"); manager.AddNamespace("ccts", "urn:un:unece:uncefact:documentation:2"); manager.AddNamespace("ext", "urn:oasis:names:specification:ubl:schema:xsd:CommonExtensionComponents-2"); //manager.AddNamespace("", "urn:oasis:names:specification:ubl:schema:xsd:Invoice-2"); XmlNodeList list = doc.SelectNodes("//cbc:ID", manager); 

鉴于评论,我将假设您可以使用LINQ to XML:

 XDocument doc = XDocument.Load("..."); XNamespace cbcNs = "urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-2"; XNamespace cacNs = "urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-2"; // etc XNamespace topNs = "urn:oasis:names:specification:ubl:schema:xsd:Invoice-2"; var ids = doc.Elements(topNs + "Invoice") .Elements(cbc + "ID"); 

或者最上面的一个只是根元素,最后的语句可以是:

 var ids = doc.Root.Elements(cbc + "ID");