2010-07-31 214 views
4

我想使用XML文件來存儲電影數據庫的數據,但我有一個問題,我是新的使用XML文件,並已使用教程和MSDN來弄清楚,但我堅持提前致謝inline xml文字中的空名稱空間 - 如何刪除xmlns?

這裏是代碼我使用

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 

酒店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 =中的所有節點

刪除父節點

誰能告訴我什麼,我做錯了什麼?

回答

2

看來(雖然你沒有分享它)電影XML文件使用命名空間。所以我假定在那個文件的某個地方(可能在根元素上),你會有類似xmlns =「mymovieurl」的東西。 要認識到的重要一點是每個XML元素和屬性都由一對字符串標識。本地名稱(Movie,DVD,VHS,...)和名稱空間URI(空,mymovieurl,...)。在上面的代碼中,由於您沒有指定默認名稱空間,所有元素都位於空的名稱空間中(它們的名稱空間URI是空字符串)。 但是您添加的這些XML文件的某些非空名稱空間(mymovieurl)中包含其元素。 爲了保留要添加的元素的名稱空間,代碼必須注入xmlns =「」屬性,該屬性將該元素及其所有子元素標記爲空名稱空間(就像您在代碼中指定的那樣)。

解決方案取決於您想實現的目標。我假設你想將元素添加到文件的其餘部分使用的命名空間中。

一個簡單的方法來做到這一點是添加 進口

這意味着,在你的代碼的所有元素沒有前綴應該屬於命名空間「mymovieurl」。 (只需將其更改爲電影文件正在使用的任何名稱空間URI)。

0

k是的我正在使用一個命名空間,我導入命名空間,我想它只是沒有在過程中良好傳輸,所以我應該在我的代碼中做什麼呢?

進口 '<' 的xmlns:電影= 「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>) 
1

進口工作就像在XML命名空間聲明。由於您沒有向我們展示輸入XML或命名空間URI,因此您無法顯示正確的代碼。

假設你的文件使用的命名空間URI「mynsuri」,那麼你需要添加類似:

Imports <xmlns="mynsuri"> 

這將使是這樣的,在你的代碼的所有元素不指定一個前綴,將屬於「mynsuri」。假設你真的希望Movie元素及其子元素屬於該名稱空間。

也許有一點更加明確的辦法是:

Imports <xmlns:movie="mynsuri"> 

然後在你的代碼,你會創建一個類似的元素:

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

命名空間聲明(中的xmlns:電影=」 '屬性)將在序列化過程中自動添加到輸出中。

相關問題