Как получить список узлов XML через XPath в котором есть XmlNamespace?
Пытаюсь найти элементы complexType в XSD документе через XPath.
Но явно не понимаю как работаю неймспейсы и как настроить XmlNamespaceManager
_document = New XmlDocument()
_document.Load(current_xsd)
Dim nsmgr As XmlNamespaceManager = New XmlNamespaceManager(_document.NameTable)
nsmgr.AddNamespace("xs", "http://common")
Dim nodeList As XmlNodeList = _document.SelectNodes("//complexType", nsmgr)
For Each node As XmlNode In nodeList
Next
Часть документа:
<?xml version="1.0" encoding="utf-8"?>
<xs:schema id="Catalog" targetNamespace="http://catalog" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xc="http://common" xmlns="http://catalog">
<xs:import namespace="http://common" schemaLocation="Common.xsd"/>
<xs:complexType name="brigade">
<xs:complexContent>
<xs:extension base="xc:extraFieldContainer">
<xs:sequence>
<xs:element name="brigadier" type="staffPersonnelNumber" minOccurs="1" maxOccurs="1"/>
<xs:element name="employees" type="employeCollection" minOccurs="0" maxOccurs="1"/>
</xs:sequence>
<xs:attribute name="name" type="xs:string" use="required"/>
</xs:extension>
</xs:complexContent>
</xs:complexType>
</xs:schema>
Ответы (3 шт):
Автор решения: Alexander Petrov
→ Ссылка
Элемент complexType в приведённом xml имеет префикс xs, который указывает на пространство имён http://www.w3.org/2001/XMLSchema. Именно это пространство имён нужно добавить в XmlNamespaceManager.
nsmgr.AddNamespace("xs", "http://www.w3.org/2001/XMLSchema")
Далее нужно добавлять наш префикс (который тоже назван xs, но он не обязан совпадать с префиксом в xml) в xpath.
Dim nodeList As XmlNodeList = _document.SelectNodes("//xs:complexType", nsmgr)
Автор решения: Yitzhak Khabinsky
→ Ссылка
c#
void Main()
{
const string FILENAME = @"e:\Temp\current_xsd.xml";
const string BRIGADE = "brigade";
XDocument doc = XDocument.Load(FILENAME);
// получить соответствующее пространство имен
XNamespace ns = doc.Root.GetNamespaceOfPrefix("xs");
// найти все дочерние элементы для BRIGADE
var elems = doc.Descendants(ns + "complexType")
.Where(d => d.Attribute("name").Value.Equals(BRIGADE))
.Descendants(ns + "element");
// перебрать последовательность для элементов BRIGADE
foreach (var elem in elems)
{
Console.WriteLine("name: '{0}', type: '{1}', minOccurs: '{2}', maxOccurs: '{3}'"
, elem.Attributes("name").FirstOrDefault()?.Value
, elem.Attributes("type").FirstOrDefault()?.Value
, elem.Attributes("minOccurs").FirstOrDefault()?.Value
, elem.Attributes("maxOccurs").FirstOrDefault()?.Value
);
}
}
результат
name: 'brigadier', type: 'staffPersonnelNumber', minOccurs: '1', maxOccurs: '1'
name: 'employees', type: 'employeCollection', minOccurs: '0', maxOccurs: '0'