Я 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?
Хм, я заметил, что если я редактировать XML-файл и измените атрибут xmlns на xmlns: x = "http://schemas.mycomp.com/product/settings", тогда документ разбирается просто отлично. Я думаю, что это связано с тем, что элементы находятся в пространстве имен по умолчанию, что вызывает у меня проблемы ... – Benj
Не забудьте включить x: в ваше выражение XPath в этом случае. /x: Элемент по-прежнему будет соответствовать, в то время как/Element будет соответствовать двум вещам: с пространством имен по умолчанию и без пространства имен. –