2010-07-31 107 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:电影=” '属性)将在序列化过程中自动添加到输出中。