пустое пространство имен во встроенном литерале xml - как удалить xmlns? - PullRequest
4 голосов
/ 31 июля 2010

Я пытаюсь использовать XML-документы для хранения данных для базы данных фильмов, но у меня возникла проблема, я новичок в использовании XML для документов и использую учебные пособия и MSDN, чтобы выяснить это, но я застрял заранее спасибо

вот код, который я использую

Imports <"...\movies.xml">

Private Sub btnAdd_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnAdd.Click

    Dim movieToAdd As Movie = getMovieInfo()
    MovieBindingSource.AddNew()
    Dim doc = XDocument.Load("..\..\movies.xml")
    Dim movieAdd = (<temp>
                        <Movie>
                            <MovieID><%= movieToAdd.MovieID %></MovieID>
                            <MovieTitle><%= movieToAdd.MovieTitle %></MovieTitle>
                            <Studio><%= movieToAdd.Studio %></Studio>
                            <Director><%= movieToAdd.Direcotor %></Director>
                            <ReleaseYear><%= movieToAdd.ReleaseYear %></ReleaseYear>
                            <Genre><%= movieToAdd.Genre %></Genre>
                            <Rating><%= movieToAdd.Rating %></Rating>
                            <DVD><%= movieToAdd.DVD %></DVD>
                            <BluRay><%= movieToAdd.BluRay %></BluRay>
                            <VHS><%= movieToAdd.VHS %></VHS>
                            <ScreenFormat><%= movieToAdd.ScreenFormat %></ScreenFormat>
                            <MovieCase><%= movieToAdd.MovieCase %></MovieCase>
                            <RunTime><%= movieToAdd.RunTime %></RunTime>
                            <NumberOfDiscs><%= movieToAdd.NumberOfDiscs %></NumberOfDiscs>
                        </Movie>
                    </temp>)
    Try
        Dim addMovie = doc.<movies:Movies>(0)
        addMovie.Add(movieAdd.Nodes())
        doc.Save("..\..\movies.xml")
    Catch ex As Exception
        Throw ex
    End Try
End Sub

Private Function getMovieInfo() As Movie

    Dim movieToAdd As New Movie

    movieToAdd.MovieID = CInt(MovieIDTextBox.Text)
    movieToAdd.MovieTitle = MovieTitleTextBox.Text
    movieToAdd.Studio = StudioTextBox.Text
    movieToAdd.Direcotor = DirecotorTextBox.Text
    movieToAdd.ReleaseYear = ReleaseYearTextBox.Text
    movieToAdd.Genre = GenreComboBox.SelectedText
    movieToAdd.Rating = RatingComboBox.SelectedText
    movieToAdd.ScreenFormat = ScreenFormatComboBox.SelectedText
    movieToAdd.NumberOfDiscs = NumberOfDiscsTextBox.Text
    movieToAdd.RunTime = CInt(RunTimeTextBox.Text)
    movieToAdd.BluRay = CBool(BluRayCheckBox.CheckState)
    movieToAdd.DVD = CBool(DVDCheckBox.CheckState)
    movieToAdd.VHS = CBool(VHSCheckBox.CheckState)
    movieToAdd.MovieCase = CBool(MovieCaseCheckBox.CheckState)

    Return movieToAdd
End Function

Inn XML-файл Я получаю это

<Movie xmlns="">
  <MovieID>22</MovieID>
  <MovieTitle>test</MovieTitle>
  <Studio>test</Studio>
  <Director>test</Director>
  <ReleaseYear>2121</ReleaseYear>
  <Genre></Genre>
  <Rating></Rating>
  <DVD>false</DVD>
  <BluRay>false</BluRay>
  <VHS>false</VHS>
  <ScreenFormat></ScreenFormat>
  <MovieCase>false</MovieCase>
  <RunTime>123</RunTime>
  <NumberOfDiscs>2</NumberOfDiscs>
</Movie>

Почему я получаю это xmlns = "" в родительском узле фильма?

Если я удаляю родительский узел из переменной movieAdd, он помещает xlmns = во все узлы

Может кто-нибудь показать мне, что я делаю неправильно?

Ответы [ 3 ]

2 голосов
/ 31 июля 2010

Кажется (хотя вы не делитесь им), что XML-файл фильмов использует пространства имен. Поэтому я предполагаю, что где-то в этом файле (возможно, в корневом элементе) у вас будет что-то вроде xmlns = "mymovieurl". Важно понимать, что каждый элемент и атрибут XML идентифицируется парой строк. Локальное имя (Movie, DVD, VHS, ...) и URI пространства имен (пусто, mymovieurl, ...). В приведенном выше коде, поскольку вы не указали пространство имен по умолчанию, все ваши элементы находятся в пустом пространстве имен (их URI пространства имен представляет собой пустую строку). Но ваш XML-файл, к которому вы добавляете эти файлы, имеет свои элементы в некотором непустом пространстве имен (mymovieurl). Чтобы сохранить пространство имен для добавляемого элемента, код должен внедрить атрибут xmlns = "", который помечает этот элемент и все его дочерние элементы в пустом пространстве имен (так же, как вы указали его в своем коде).

Решение зависит от того, чего вы хотите достичь. Я предполагаю, что вы хотите добавить элементы в пространство имен, используемое остальной частью файла.

Один простой способ сделать это - добавить Импорт

Это означает, что все элементы в вашем коде без префикса должны принадлежать пространству имен "mymovieurl". (Просто измените его на любой URI пространства имен, который используется в вашем фильме).

1 голос
/ 18 августа 2010

Импорт работает так же, как объявление пространства имен в XML.Так как вы не показали нам входной XML или URI пространства имен, в котором вы хотите, чтобы выходной XML содержался, невозможно отобразить правильный код.

Если ваш файл использует URI пространства имен "mynsuri", то вам нужнодобавить что-то вроде:

Imports <xmlns="mynsuri">

Это произойдет так, что все элементы в вашем коде, которые не указывают префикс, будут принадлежать «mynsuri».Это предполагает, что вы на самом деле хотите, чтобы элемент Movie и его дочерние элементы принадлежали этому пространству имен.

Возможно, немного более явным способом было бы:

Imports <xmlns:movie="mynsuri">

И тогда в вашем кодесоздайте такие элементы, как:

<movie:Movie><movie:MovieID> ...

Объявления пространства имен (атрибут xmlns: movie = '') будут автоматически добавлены в вывод при сериализации.

0 голосов
/ 31 июля 2010

k да Я использую пространство имен, я импортирую пространство имен, я думаю, что оно просто не очень хорошо переносилось в процессе, так что я должен делать в своем коде, это так?

Imports '<'xmlns: movies = "G: \ Visual Studio 2008 \ Проекты \ Каталог фильмов \ Каталог фильмов \ movies.xml">

    Dim movieAdd = (<temp>
                        <Movie xmlns="G:\Visual Studio 2008\Projects\Movie Catalog\Movie Catalog\movies.xml">
                            <MovieID><%= movieToAdd.MovieID %></MovieID>
                            <MovieTitle><%= movieToAdd.MovieTitle %></MovieTitle>
                            <Studio><%= movieToAdd.Studio %></Studio>
                            <Director><%= movieToAdd.Direcotor %></Director>
                            <ReleaseYear><%= movieToAdd.ReleaseYear %></ReleaseYear>
                            <Genre><%= movieToAdd.Genre %></Genre>
                            <Rating><%= movieToAdd.Rating %></Rating>
                            <DVD><%= movieToAdd.DVD %></DVD>
                            <BluRay><%= movieToAdd.BluRay %></BluRay>
                            <VHS><%= movieToAdd.VHS %></VHS>
                            <ScreenFormat><%= movieToAdd.ScreenFormat %></ScreenFormat>
                            <MovieCase><%= movieToAdd.MovieCase %></MovieCase>
                            <RunTime><%= movieToAdd.RunTime %></RunTime>
                            <NumberOfDiscs><%= movieToAdd.NumberOfDiscs %></NumberOfDiscs>
                        </Movie>
                    </temp>)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...