2009-02-18 5 views
10

У меня есть этот XML-документ с пространствами имен, и я хочу извлечь некоторые узлы с помощью XPath.XPath в документе XML с пространством имен

Вот документ:

<ArrayOfAnyType xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://tempuri.org/"> 
    <anyType xsi:type="Document"> 
    <Id>5</Id> 
    <Title>T1</Title> 
    </anyType> 

    <anyType xsi:type="Document"> 
    <Id>15</Id> 
    <Title>T15</Title> 
    </anyType> 
</ArrayOfAnyType> 

Что выражение XPath будет, если я хочу, чтобы извлечь все «anyType» элементы с XSI: Тип = «Документ»?

Я попытался это:

//anyType[@xsi:type="Document"] 

и он не работает:

+0

версию XPath вы используете? версии xpath обрабатывают пространства имен по-разному? –

+0

Похоже, я должен сказать: '// xmlns: anyType [@xsi: type = "Document"]' для его работы – EnToutCas

+0

Duped: - http://stackoverflow.com/questions/536441/xpath-namespace-driving -me-crazy - http://stackoverflow.com/questions/11345/xpaths-and-default-namespaces - http://stackoverflow.com/questions/103576/whats-wrong-with-my-xpath-xml – annakata

ответ

16

Если вы используете C#, то вам необходимо указать пространство имен для элемента «anyType» в вашем XPath:

var xml = new XmlDocument(); 
xml.LoadXml("your xml"); 
var names = new XmlNamespaceManager(xml.NameTable); 
names.AddNamespace("xsi", "http://www.w3.org/2001/XMLSchema-instance"); 
names.AddNamespace("a", "http://tempuri.org/"); 
var nodes = xml.SelectNodes("//a:anyType[@xsi:type='Document']", names); 
+0

Что с 'a: anyType'? Это какая-то волшебная ценность? – jcollum

+0

Нет, это имя элемента XML, запрашиваемого в вышеупомянутом вопросе. – David

+0

ах, я вижу, не прокрутил достаточно далеко – jcollum

0

Я думаю, что

//anyType[namespace-uri() = "http://www.w3.org/2001/XMLSchema-instance"][local-name() = "type"] 

Будет делать то, что вы хотите.

+0

Спасибо, я думаю, что не так в моем оригинальном выражении, мне нужно префикс anyType с пространством имен «xmlns». – EnToutCas

-1

бы почти такая же проблема, я забыл добавить правильное пространство имен XSI: тип (http://www.w3.org/2001/XMLSchema-instance) использовал http://www.w3.org/2001/XMLSchema , и я ни разу не получить никакого результата - теперь он работает следующим образом:

<xsl:value-of select="/item1/item2/item3/@xsi:type"></xsl:value-of> 
0

Таким образом, вам не нужно указать пространство имен:

XmlDocument xmlDoc = new XmlDocument(); 
xmlDoc.LoadXml("your xml"); 
XmlNode node = xmlDoc.SelectSingleNode("/*[local-name() = 'anyType']"); 
XmlNode nodeToImport = xmlDoc2.ImportNode(node, true); 
xmlDoc2.AppendChild(nodeToImport); 
Смежные вопросы