ImportError: Невозможно импортировать имя X

Я столкнулся с аналогичной проблемой с пустым пространством имен по умолчанию. В этом примере 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» вернул мои результаты так, как я хотел. Надеюсь, это поможет прояснить проблему для других.

425
задан Marco 3 January 2019 в 13:07
поделиться

2 ответа

Не специально для этого автора вопроса, но этой той же ошибки покажет, не соответствует ли имя класса в Вашем импорте определению в файле, Вы импортируете из.

0
ответ дан 22 November 2019 в 22:51
поделиться

Один способ отследить ошибку импорта шаг за шагом пытается запустить Python на каждом из импортированных файлов для разыскивания плохо один.

  1. Вы получаете что-то как:

    python ./main.py
    

    ImportError: не может импортировать называют

  2. затем, Вы запускаетесь:

    python ./modules/a.py
    

    ImportError: не может импортировать B

  3. имени затем, Вы запускаетесь:

    python ./modules/b.py
    

    ImportError: не может импортировать имя C (некоторые НЕ - Существующий модуль или некоторая другая ошибка)

0
ответ дан 22 November 2019 в 22:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: