1

私のコードが生成しているxmlファイルは次のとおりです

<?xml version="1.0"?>
<DataClass xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <pathI>D:\POC\Input\2</pathI>
  <pathO>D:\POC\Output</pathO>
  <prefix>2_</prefix>
  <frequency>25</frequency>
</DataClass><?xml version="1.0"?>
<DataClass xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <pathI>D:\POC\Input\3</pathI>
  <pathO>D:\POC\Output</pathO>
  <prefix>3_</prefix>
  <frequency>33</frequency>
</DataClass>

xml にルート要素を追加して、さらに xml を使用してデータ グリッド ビューを設定できるようにしたいと考えています。可能であれば、すべてのノードからタグを削除したい..助けが必要

DataClass data = new DataClass();
data.pathI = txt_input.Text;
data.pathO = txt_Output.Text;
data.frequency = Convert.ToInt32(txt_freq.Text);
data.prefix = txt_prefix.Text;
XmlDocument doc = new XmlDocument();


XmlSerializer xs = new XmlSerializer(typeof(DataClass));
if (!File.Exists("Data.xml"))
{
    using (FileStream fs = new FileStream("Data.xml", FileMode.Create))
    {
         xs.Serialize(fs, data);
         fs.Close();
         fs.Dispose();
         MessageBox.Show("Data loaded to the xml");
    }
}
else if (File.Exists("Data.xml"))
{
     using (FileStream fs = new FileStream("Data.xml",FileMode.Append))
     {
          xs.Serialize(fs, data);
          fs.Close();
          fs.Dispose();
          MessageBox.Show("Data loaded to the xml");
     }
}
4

1 に答える 1

1

シリアライゼーションを通じてこの方法でオブジェクトを追加する方法がわかりません。私が知っている唯一の代替手段は、オブジェクトの配列をシリアル化することです。これは次のようになります。

DataClass[] objects = ...//get all your objects
if(xs == null) 
{
    xs = new XmlSerializer(typeof(DataClass[]), 
                           new XmlRootAttribute("Your root name"));
}
using (FileStream fs = new FileStream("Data.xml", FileMode.Create))
{
    xs.Serialize(fs, data);
    fs.Close();
}

シリアライザーを静的に宣言することを検討してください (理由を理解するには、「マネージ コードでのメモリ リークの特定と防止」を参照してください)。

private static readonly XmlSerializer xs;

ただし、代わりに Linq to Xml を使用することにオープンであれば、必要な機能を得ることができます。ただし、xml を変更する必要があるたびに、xml 全体をメモリにロードする必要があります。

XElement x;
if (File.Exists("Data.xml"))
    x = XElement.Load("Data.xml");
else
    x = new XElement("Data");
x.Add(new XElement("DataClass",
                    new XElement("pathI", @"D:\POC\Input\2"),
                    new XElement("pathO", @"D:\POC\Output"),
                    new XElement("prefix", "2_"),
                    new XElement("frequency", "25")));
x.Save("Data.xml");

Arie ( XmlDocument への Serialise オブジェクト)によって提供されたリンクのおかげで、次のことができます。

XmlDocument temp = new XmlDocument();   //create a temporary xml document
var navigator = temp.CreateNavigator(); //use its navigator
using (var w = navigator.AppendChild()) //to get an XMLWriter
    xs.Serialize(w, data);              //serialize your data to it

XmlDocument xdoc = new XmlDocument();   //init the main xml document
string filename = "Data.xml";
if (File.Exists(filename))              //if file exists
    xdoc.Load(filename);                //load xml from it
else                                    //or 
{
    //add xml declaration to the top of the new xml document
    xdoc.AppendChild(xdoc.CreateXmlDeclaration("1.0", "utf-8", null));
    //create the root element
    xdoc.AppendChild(xdoc.CreateElement("Data"));
}

var newchild = xdoc.CreateElement("DataClass"); //the new element
newchild.InnerXml = temp.FirstChild.InnerXml;   //copy the serialized content

//append the new element to the root
xdoc.ChildNodes[1].AppendChild(newchild);       
//save the document
xdoc.Save(filename);
于 2013-02-04T08:32:03.960 に答える