2012-01-11 1 views
1

Я XML-новичок и у меня есть документ XML (который я не могу изменить, потому что он приходит откуда-то еще), но она имеет корневой узел, как это:Почему я не могу использовать xpath для разбора узлов в пространстве имен по умолчанию?

<Configuration xmlns="http://schemas.mycomp.com/product/settings" version="2.0.0"> 

Я пытаюсь разобрать этот документ с msxml и xpath, и я сделал это успешно, если я удалю атрибут xmlns. По какой-то причине, с этим атрибутом xmlns, документ не будет анализироваться. Я попытался установить MSXML парсер, чтобы распознать документ, используя:

m_pXMLDoc->setProperty(_bstr_t(L"AllowDocumentFunction"), _variant_t(true)); 
m_pXMLDoc->setProperty(_bstr_t(L"AllowXsltScript"), _variant_t(true)); 
m_pXMLDoc->setProperty(_bstr_t(L"SelectionLanguage"), _variant_t(L"XPath")); 
m_pXMLDoc->setProperty(_bstr_t(L"SelectionNamespaces"), _variant_t(L"xmlns='http://schemas.mycomp.com/product/settings'")); 

m_pXMLDoc->preserveWhiteSpace = VARIANT_FALSE; 
m_pXMLDoc->resolveExternals = VARIANT_TRUE; 
m_pXMLDoc->validateOnParse = VARIANT_FALSE; 

От чтения вокруг выглядит как XPath работает только на «нет имени» имен, и этот документ не устанавливает пространство имен по умолчанию, так что он больше не "без имени". Могу ли я установить пространство имен, используемое xpath с использованием MSXML?

+0

Хм, я заметил, что если я редактировать XML-файл и измените атрибут xmlns на xmlns: x = "http://schemas.mycomp.com/product/settings", тогда документ разбирается просто отлично. Я думаю, что это связано с тем, что элементы находятся в пространстве имен по умолчанию, что вызывает у меня проблемы ... – Benj

+0

Не забудьте включить x: в ваше выражение XPath в этом случае. /x: Элемент по-прежнему будет соответствовать , в то время как/Element будет соответствовать двум вещам: с пространством имен по умолчанию и без пространства имен. –

ответ

2

С Microsoft: Это поведение является ...

См http://support.microsoft.com/kb/288147

Используйте префиксы с пространствами имен при указании свойство по SelectionNamespaces

+0

Да, я боялся, что это так. К сожалению, не большой ответ, если вам нужно разбирать кого-то elses XML, хотя :-( – Benj