none
xmlファイルの追加更新はどうやってするのでしょうか。 RRS feed

  • 質問

  • 毎度初心の質問ですいません。

    xmlファイルの更新についてですが、書き直すしかないのなら仕方ありませんが、AppendChildというものが

    あるので、気になります。

     

            Dim reader As XmlReader = XmlReader.Create("C:\○○○_log.xml")

            Dim st As String = ""
            While reader.Read()
                st = st + reader.ReadOuterXml  ’------①
            End While

            Dim doc As New XmlDocument()
            doc.LoadXml(st)
            reader.Close()
            Dim settings As New XmlWriterSettings()
            settings.Indent = True
            settings.IndentChars = "    "
            Dim writer As XmlWriter = XmlWriter.Create("C:\○○○_log.xml", settings)

            Dim root As XmlNode = doc.DocumentElement

            Dim elem As XmlElement = doc.CreateElement("table")

        elem.InnerText = "あいうえお"
            root.AppendChild(elem)
            root.WriteTo(writer)

            writer.Flush()

    ①の段階で、追加項目を書き換えることはできますが、それならAppendChildの意味がありません。

    なんかちゃんとした方法があるのでしょうか。

    よろしくお願いします。

    2008年11月6日 23:11

回答

  • #LoadXml メソッドはファイル名も渡せますよ。

     

    LoadXml メソッドの結果としてXmlDocument 内にノードツリーが構築されていますので

    好きなノードを追加したり消したり書き換えたりはできます。

     

    まずはノードを特定する必要があります。

    XmlNode.SelectSingleNode(), SelectNodes()

    を調べてみてください。

     

    2008年11月7日 0:23
  • まどか様

    いつもご指導ありがとうございます。

    ヘルプに例が載っていたので、簡単なのはできました。

    しかし、xmlwriter でかけるような複雑なものができなかったのです。

    もう一度、その路線でやってみます。

     

    ついでですが、これができると楽なんですが、

    Dim settings As XmlWriterSettings = New XmlWriterSettings()
    settings.OmitXmlDeclaration = true
    settings.ConformanceLevel = ConformanceLevel.Fragment
    settings.CloseOutput = false

    ' Create the XmlWriter object and write some content.
    Dim strm as MemoryStream = new MemoryStream()
    Dim writer As XmlWriter = XmlWriter.Create(strm, settings)
    writer.WriteElementString("orderID", "1-456-ab")
    writer.WriteElementString("orderID", "2-36-00a")
    writer.Flush()
    writer.Close()

    MSDNの英語版に載っていたのですが、2005でもavailableと書いてあるのですが、

    strmの値はNullのまま、Positionは0のままです。どうしてでしょうか。

     

    #LoadXml メソッドはファイル名も渡せますよ。

    これはこれを書いた後直ぐにわかりました。

    どうも、初心で申し訳ございません。

     

    2008年11月7日 7:38

すべての返信

  • #LoadXml メソッドはファイル名も渡せますよ。

     

    LoadXml メソッドの結果としてXmlDocument 内にノードツリーが構築されていますので

    好きなノードを追加したり消したり書き換えたりはできます。

     

    まずはノードを特定する必要があります。

    XmlNode.SelectSingleNode(), SelectNodes()

    を調べてみてください。

     

    2008年11月7日 0:23
  • まどか様

    いつもご指導ありがとうございます。

    ヘルプに例が載っていたので、簡単なのはできました。

    しかし、xmlwriter でかけるような複雑なものができなかったのです。

    もう一度、その路線でやってみます。

     

    ついでですが、これができると楽なんですが、

    Dim settings As XmlWriterSettings = New XmlWriterSettings()
    settings.OmitXmlDeclaration = true
    settings.ConformanceLevel = ConformanceLevel.Fragment
    settings.CloseOutput = false

    ' Create the XmlWriter object and write some content.
    Dim strm as MemoryStream = new MemoryStream()
    Dim writer As XmlWriter = XmlWriter.Create(strm, settings)
    writer.WriteElementString("orderID", "1-456-ab")
    writer.WriteElementString("orderID", "2-36-00a")
    writer.Flush()
    writer.Close()

    MSDNの英語版に載っていたのですが、2005でもavailableと書いてあるのですが、

    strmの値はNullのまま、Positionは0のままです。どうしてでしょうか。

     

    #LoadXml メソッドはファイル名も渡せますよ。

    これはこれを書いた後直ぐにわかりました。

    どうも、初心で申し訳ございません。

     

    2008年11月7日 7:38
  • まどか様のアドバイスでできるようになりました。

    一度はあきらめて、ファイル形式でやってたんですけど、どっちがいいのでしょうか。

    こんな感じです。

       Dim doc As XmlDocument = New XmlDocument
            doc.LoadXml(st)
            Dim root As XmlNode = doc.DocumentElement
            Dim elem As XmlElement = doc.CreateElement("table")
            Dim ele2 As XmlElement = doc.CreateElement("TABLEName")
            ele2.InnerText = "TESTtable"
            elem.AppendChild(ele2)
            Dim el(100) As XmlElement
            Dim attr As XmlAttribute
            Dim att2 As XmlAttribute
            For i As Integer = 0 To FCount - 1
                el(i) = doc.CreateElement("Field")
                attr = el(i).SetAttributeNode("FieldNo", "")
                attr.Value = i.ToString
                att2 = el(i).SetAttributeNode("Name", "")
                att2.Value = Field(i)
                elem.AppendChild(el(i))
            Next
            root.InsertAfter(elem, root.LastChild)
            doc.Save(gCpath + gDBLog)
    要素の値を変更するのは、selectsingleを使うのですね。

     

     doc.LoadXml(pah)のところに、ファイルパスを入れると、1行目の1番が不正とされます。

     

     

    2008年11月8日 7:41