【问题标题】:empty namespace in inline xml literal - how to remove xmlns?内联 xml 文字中的空命名空间 - 如何删除 xmlns?
【发布时间】:2010-07-31 01:43:48
【问题描述】:

我正在尝试使用 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

客栈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 = 放入所有节点中

谁能告诉我我做错了什么?

【问题讨论】:

    标签: xml vb.net xsd


    【解决方案1】:

    看起来(尽管您没有分享)电影 XML 文件使用了命名空间。所以我假设在那个文件的某个地方(可能在根元素上)你会有类似 xmlns="mymovieurl" 的东西。 要意识到的重要一点是,每个 XML 元素和属性都由一对字符串标识。本地名称(电影、DVD、VHS、...)和命名空间 URI(空、mymovieurl、...)。在上面的代码中,由于您没有指定默认命名空间,所有元素都在空命名空间中(它们的命名空间 URI 是一个空字符串)。 但是您要添加这些的 XML 文件的元素位于一些非空名称空间 (mymovieurl) 中。 为了保留要添加的元素的命名空间,代码必须注入 xmlns="" 属性,该属性将该元素及其所有子元素标记为空命名空间(就像您在代码中指定的一样)。

    解决方案取决于您想要实现的目标。我假设您想将元素添加到文件其余部分使用的命名空间中。

    一种简单的方法是添加 进口

    这意味着代码中没有前缀的所有元素都应该属于命名空间“mymovieurl”。 (只需将其更改为电影文件使用的任何命名空间 URI)。

    【讨论】:

      【解决方案2】:

      Imports 就像 XML 中的命名空间声明一样工作。由于您没有向我们显示输入 XML 或您希望输出 XML 所在的命名空间 URI,因此不可能显示正确的代码。

      假设您的文件使用命名空间 URI“mynsuri”,那么您需要添加如下内容:

      Imports <xmlns="mynsuri">
      

      这将使代码中所有未指定前缀的元素都属于“mynsuri”。这是假设您确实希望 Movie 元素及其子元素属于该命名空间。

      也许更明确的方式是:

      Imports <xmlns:movie="mynsuri">
      

      然后在您的代码中创建如下元素:

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

      命名空间声明(xmlns:movie='' 属性)将在序列化期间自动为您添加到输出中。

      【讨论】:

        【解决方案3】:

        k 是的,我正在使用命名空间,我确实导入了命名空间,我猜它只是在过程中没有很好地传输,所以我应该在我的代码中做的是这样吗?

        导入'

            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>)
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-08-08
          • 1970-01-01
          • 2012-01-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-11-23
          • 1970-01-01
          相关资源
          最近更新 更多