Узел выбора XPath с пространством имен

Я ранее установил поле идентификатора в своей модели Мира, что-то сбивало с толку, поскольку я удалил его, я добавил строку:

id = models.AutoField(primary_key=True)

Когда я запускал makemitigrations снова он спросил меня, переименовал ли я поле идентификатора в это новое, и я нажал «да», и это разобралось.

Моя модель сейчас:

class World(models.Model):
    id = models.AutoField(primary_key=True)
    user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, default='')
    name = models.CharField(max_length=200)
    setting = models.CharField(max_length=200)
    creation_date = models.DateTimeField('date created')
64
задан Peter 8 March 2016 в 08:40
поделиться

5 ответов

Лучший способ сделать вещи как это (по моему скромному мнению), состоит в том, чтобы создать менеджера по пространству имен. Это может использоваться, называя SelectNodes для указания, какие URL пространства имен подключены с который префиксы. Я обычно настроил статическое свойство, которое возвращает соответствующий экземпляр как это (это - C#, необходимо будет перевести):

private static XmlNamespaceManager _nsMgr;
public static XmlNamespaceManager NsMgr
{
  get
  {
    if (_nsMgr == null)
    {
      _nsMgr = new XmlNamespaceManager(new NameTable());
      _nsMgr.AddNamespace("msb", "http://schemas.microsoft.com/developer/msbuild/2003");
    }
    return _nsMgr;
  }
}

я включаю только одно пространство имен здесь, но у Вас могли быть несколько. Затем можно выбрать из документа как это:

Dim value As Object = xmlDoc.SelectNodes("/msb:Project/msb:PropertyGroup/msb:ProjectGuid", NsMgr)

Примечание, что все элементы находятся в указанном пространстве имен.

44
ответ дан Peter 24 November 2019 в 15:49
поделиться

Я, вероятно, был бы склонен пойти с <забастовкой> Bartek * решение для пространства имен, но общее xpath решение:

//*[local-name()='ProjectGuid']

**, так как ответ Bartek исчез, я рекомендую Teun (который на самом деле более полон), *

63
ответ дан annakata 24 November 2019 в 15:49
поделиться

Эта проблема уже была здесь несколько времена .

Любой Вы работаете с агностическими пространством имен выражениями XPath (не рекомендуемый для его неуклюжести и потенциала для ложных положительных совпадений - <msb:ProjectGuid>, и <foo:ProjectGuid> то же для этого выражения):

//*[local-name() = 'ProjectGuid']

или Вы делаете правильную вещь и используете XmlNamespaceManager для регистрации пространства имен URI, таким образом, можно включать префикс пространства имен в XPath:

Dim xmlDoc As New XmlDocument()
xmlDoc.Load(Path.Combine(mDirectory, name, name + ".vbproj"))

Dim nsmgr As New XmlNamespaceManager(xmlDoc.NameTable)
nsmgr.AddNamespace("msb", "http://schemas.microsoft.com/developer/msbuild/2003")

Dim xpath As String = "/msb:Project/msb:PropertyGroup/msb:ProjectGuid"
Dim value As Object = xmlDoc.SelectNodes(xpath, nsmgr)
27
ответ дан Community 24 November 2019 в 15:49
поделиться

Необходимо только зарегистрировать это пространства имен XML и партнер префикса, чтобы заставить запрос работать. Создайте и передайте менеджера по пространству имен как второй параметр при выборе узлов:

Dim ns As New XmlNamespaceManager ( xmlDoc.NameTable )
ns.AddNamespace ( "msbuild", "http://schemas.microsoft.com/developer/msbuild/2003" )
Dim value As Object = xmlDoc.SelectNodes("/msbuild:Project/msbuild:PropertyGroup/msbuild:ProjectGuid", ns)
3
ответ дан baretta 24 November 2019 в 15:49
поделиться

Почему бы не использовать//для игнорирования пространства имен:

Dim value As Object = xmlDoc.SelectNodes("//ProjectGuid")

//действует как подстановочный знак для выполнения всего между корнем и следующим указанным именем узла (т.е. ProjectGuid)

-7
ответ дан Lonzo 24 November 2019 в 15:49
поделиться
Другие вопросы по тегам:

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