2010-12-07 8 views
0

私がここでやろうとしているのは、要素がXML文書に存在するかどうかを確認することです。存在する場合は、内部のテキストを変更します。それが存在しない場合、私はそれを作成し、それに適した内部テキストを作成したいと思います。しかし、要素が存在し、内部のテキストを変更しようとすると、それよりも短い何かにxmlファイル全体が書き換えられたように見えます。XML.Saveファイル作成の謎

マイコード:

   XmlDocument xmldoc = new XmlDocument(); 
       xmldoc.Load(path); 
       XmlNodeList felement = xmldoc.GetElementsByTagName(Element); 
       FileStream fs = new FileStream(path, FileMode.Open, FileAccess.ReadWrite, FileShare.ReadWrite); 
       if (felement.Count == 0) 
       { 
        XmlElement elmRoot = xmldoc.DocumentElement; 
        XmlElement xmlele = xmldoc.CreateElement(Element); 
        xmlele.AppendChild(xmldoc.CreateTextNode(data)); 
        elmRoot.AppendChild(xmlele); 
        xmldoc.Save(fs); 
       } 
       else 
       { 
        felement[0].InnerText = data; 
        xmldoc.Save(fs); 
       } 
       fs.Close(); 

短い内部テキストを変更する前に、XMLファイル:

<?xml version="1.0" encoding="utf-8"?> 
<MyXMLFile> 
    <Source>C:\Users\Dacto\Desktop\</Source> 
    <Destination>C:\Program Files\Adobe</Destination> 
</MyXMLFile> 

短い内部テキストの後:

<?xml version="1.0" encoding="utf-8"?> 
<MyXMLFile> 
    <Source>C:\Users\Dacto\Desktop\Napster</Source> 
    <Destination>C:\Users</Destination> 
</MyXMLFile>/MyXMLFile> 

"余分な"/MyXMLFileを参照してください。 >何が起こっているの?

答えて

2

出力が有効なXMLではないため、XmlDocument.Saveがファイルの内容全体を生成したとは限りません。これを考えると、私は、FileMode.Openではなく、別のパラメータを指定する必要があると考えています.FileMode.Createは、ファイルが書き込まれる前に切り捨てられていることを保証します。現在は上書きされています。新しいファイルがそれをカバーするのに十分な大きさでない場合

+0

これは起こっているようですが、私はそれをFileMode.Truncateに変更しました。それは動作します: – Dacto

+1

嬉しいです。ファイルが存在しない可能性がある場合、FileMode.Createは、ファイルがすでに存在するかどうかによって、ファイルを作成するか、または切り捨てるため、最善の策です。 –

+0

それ以前のコードでは、パスが実際に存在するかどうかをチェックし、そうでなければパスを作成します。 – Dacto

0

問題は、あなたがXMLでなくファイルを書き出していることです。あなたが何かのように、

FileStream fs = new FileStream(path, FileMode.Open, FileAccess.ReadWrite, FileShare.ReadWrite); 
byte[] info = new UTF8Encoding(true).GetBytes("AAAAA"); 
fs.Write(info, 0, info.Length);   

をしようとすると、表示されるはずです。その代わりFileMode.Openの

AAAAA version="1.0" encoding="utf-8"?> 
<MyXMLFile> 
    <Source>C:\Users\Dacto\Desktop\</Source> 
    <Destination>C:\Program Files\Adobe</Destination> 
</MyXMLFile> 

を、それが存在する場合は、あなたがそれに書き込む前に、ファイルが切り捨てられますように、あなたは、FileMode.Createをしたいです既に。

0

XmlDocumentを保存する別のオプションは、FileStreamの代わりにXmlWriterを使用することです。あなたは、元のFileStream方法を続ける場合

XmlDocument xmldoc = new XmlDocument(); 
    xmldoc.Load(path); 
    XmlNodeList felement = xmldoc.GetElementsByTagName(Element); 

    XmlWriterSettings settings = new XmlWriterSettings(); 
    settings.Indent = true; 

    using (XmlWriter wr = XmlWriter.Create(path), settings)) 
    { 
     if (felement.Count == 0) 
     { 
      XmlElement elmRoot = xmldoc.DocumentElement; 
      XmlElement xmlele = xmldoc.CreateElement(Element); 
      xmlele.AppendChild(xmldoc.CreateTextNode(data)); 
      elmRoot.AppendChild(xmlele); 
      xmldoc.Save(wr); 
     } 
     else 
     { 
      felement[0].InnerText = data; 
      xmldoc.Save(wr); 
     } 
    } 

また、その後、私は私がしたXmlWriterに上記の行っていると、あなたがしなければ、あなたはFSを取り除くことができますように、usingステートメントでそれを包むお勧めします。 Close()ステートメント