Я столкнулся с аналогичной проблемой с пустым пространством имен по умолчанию. В этом примере XML у меня есть сочетание элементов с префиксами пространства имен и один элемент (DataBlock) без:
<src:SRCExample xmlns="urn:some:stuff:here" xmlns:src="www.test.com/src" xmlns:a="www.test.com/a" xmlns:b="www.test.com/b">
<DataBlock>
<a:DocID>
<a:IdID>7</a:IdID>
</a:DocID>
<b:Supplimental>
<b:Data1>Value</b:Data1>
<b:Data2/>
<b:Extra1>
<b:More1>Value</b:More1>
</b:Extra1>
</b:Supplimental>
</DataBlock>
</src:SRCExample>
Я попытался использовать XPath, который работал в XPath Visualizer, но не работал в моем коде:
XmlDocument doc = new XmlDocument();
doc.Load( textBox1.Text );
XPathNavigator nav = doc.DocumentElement.CreateNavigator();
XmlNamespaceManager nsman = new XmlNamespaceManager( nav.NameTable );
foreach ( KeyValuePair<string, string> nskvp in nav.GetNamespacesInScope( XmlNamespaceScope.All ) ) {
nsman.AddNamespace( nskvp.Key, nskvp.Value );
}
XPathNodeIterator nodes;
XPathExpression failingexpr = XPathExpression.Compile( "/src:SRCExample/DataBlock/a:DocID/a:IdID" );
failingexpr.SetContext( nsman );
nodes = nav.Select( failingexpr );
while ( nodes.MoveNext() ) {
string testvalue = nodes.Current.Value;
}
Я сузил его до элемента «DataBlock» XPath, но не смог заставить его работать, за исключением простого подстановки элемента DataBlock:
XPathExpression workingexpr = XPathExpression.Compile( "/src:SRCExample/*/a:DocID/a:IdID" );
failingexpr.SetContext( nsman );
nodes = nav.Select( failingexpr );
while ( nodes.MoveNext() ) {
string testvalue = nodes.Current.Value;
}
После того, как я много раз набрал чек и Google (я приземлился здесь), я решил заняться пространством имен по умолчанию непосредственно в моем загрузчике XmlNamespaceManager, изменив его на:
foreach ( KeyValuePair<string, string> nskvp in nav.GetNamespacesInScope( XmlNamespaceScope.All ) ) {
nsman.AddNamespace( nskvp.Key, nskvp.Value );
if ( nskvp.Key == "" ) {
nsman.AddNamespace( "default", nskvp.Value );
}
}
Итак, теперь точка «по умолчанию» и «» к тому же пространству имен. Как только я это сделал, XPath «/ src: SRCExample / default: DataBlock / a: DocID / a: IDID» вернул мои результаты так, как я хотел. Надеюсь, это поможет прояснить проблему для других.
Не специально для этого автора вопроса, но этой той же ошибки покажет, не соответствует ли имя класса в Вашем импорте определению в файле, Вы импортируете из.
Один способ отследить ошибку импорта шаг за шагом пытается запустить Python на каждом из импортированных файлов для разыскивания плохо один.
Вы получаете что-то как:
python ./main.py
ImportError: не может импортировать называют
затем, Вы запускаетесь:
python ./modules/a.py
ImportError: не может импортировать B
имени затем, Вы запускаетесь:
python ./modules/b.py
ImportError: не может импортировать имя C (некоторые НЕ - Существующий модуль или некоторая другая ошибка)