Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何将数据保存到xml文件而不复制数据_C#_Xml - Fatal编程技术网

C# 如何将数据保存到xml文件而不复制数据

C# 如何将数据保存到xml文件而不复制数据,c#,xml,C#,Xml,我的xml文件如下所示: <Osoby> <Osoba> <Id>1</Id> <Imie>Jan</Imie> <Nazwisko>Kowalski</Nazwisko> <Wiek>23</Wiek> </Osoba> . . . <Osoba> <Id&

我的xml文件如下所示:

<Osoby>

    <Osoba>
    <Id>1</Id>
    <Imie>Jan</Imie>
    <Nazwisko>Kowalski</Nazwisko>
    <Wiek>23</Wiek>
    </Osoba>
    .
    .
    .
    <Osoba>
    <Id>500</Id>
    <Imie>Marek</Imie>
    <Nazwisko>Nowak</Nazwisko>
    <Wiek>37</Wiek>
    </Osoba>

</Osoby>

1.
简
科瓦尔斯基
23
.
.
.
500
马雷克
诺瓦克
37
以及我写入xml文件的过程,该文件随机生成500人:

private void button1_Click(object sender, EventArgs e)
{

    button2.Visible = true;
    string[] Imie = { "Mariusz", "Mikołaj", "Przemek", "Krzysiek", "Patryk", "Janusz", "Lechu" };
    string[] Nazwisko = { "Kujawski", "Kowal", "Nowak", "Kowalski", "Dul", "Paleta", "Kawka" };
    Random losuj = new Random();

    XmlTextWriter writer = new XmlTextWriter("osoby.xml", System.Text.Encoding.UTF8);
    writer.WriteStartDocument(true);
    writer.Formatting = Formatting.Indented;
    writer.Indentation = 2;
    writer.WriteStartElement("Osoby");
    for (int i = 0; i < 500; i++)
        createNode(i.ToString(), Imie[losuj.Next(0, 7)], Nazwisko[losuj.Next(0, 7)], losuj.Next(1, 50).ToString(), writer);
    writer.WriteEndElement();
    writer.WriteEndDocument();
    writer.Close();
    MessageBox.Show("Utworzono plik XML ! ");
}
private void createNode(string pID, string pName, string pSurname, string pAge, XmlTextWriter writer)
{
    writer.WriteStartElement("Osoba");
    writer.WriteStartElement("Id");
    writer.WriteString(pID);
    writer.WriteEndElement();
    writer.WriteStartElement("Imie");
    writer.WriteString(pName);
    writer.WriteEndElement();
    writer.WriteStartElement("Nazwisko");
    writer.WriteString(pSurname);
    writer.WriteEndElement();
    writer.WriteStartElement("Wiek");
    writer.WriteString(pAge);
    writer.WriteEndElement();
    writer.WriteEndElement();
}
private void按钮1\u单击(对象发送者,事件参数e)
{
按钮2.可见=真实;
字符串[]Imie={“Mariusz”、“Mikołaj”、“Przemek”、“Krzysiek”、“Patryk”、“Janusz”、“Lechu”};
字符串[]Nazwisko={“Kujawski”、“Kowal”、“Nowak”、“Kowalski”、“Dul”、“Paleta”、“Kawka”};
Random losuj=新的Random();
XmlTextWriter=newXMLTextWriter(“osoby.xml”,System.Text.Encoding.UTF8);
writer.WriteStartDocument(true);
writer.Formatting=格式化.缩进;
writer.Indentation=2;
writer.WriteStarteElement(“Osoby”);
对于(int i=0;i<500;i++)
createNode(i.ToString(),Imie[losuj.Next(0,7)],Nazwisko[losuj.Next(0,7)],losuj.Next(1,50).ToString(),writer;
writer.writeedelement();
writer.WriteEndDocument();
writer.Close();
Show(“utworzonoplikxml!”);
}
私有void createNode(字符串pID、字符串pName、字符串pSurname、字符串页、XmlTextWriter)
{
作者:书面声明(“Osoba”);
writer.writeStarElement(“Id”);
writer.WriteString(pID);
writer.writeedelement();
作者。书面声明(“Imie”);
writer.WriteString(pName);
writer.writeedelement();
作者:书面声明(“纳兹维斯科”);
writer.WriteString(pSurname);
writer.writeedelement();
作者。书面声明(“Wiek”);
writer.WriteString(第页);
writer.writeedelement();
writer.writeedelement();
}
如何将数据保存到xml文件中,而无需复制人员

例如:我不想有这样的人:

  • Przemek Nowak 22岁
  • Przemek Nowak 22岁

不管参数“id”是什么,由于代码中的循环,它是唯一的。

好的,所以一步一步的解决方案是创建一个包含name和lastname的类Person。然后在一个循环中,首先随机生成name和lastname,并检查列表中是否已经存在这样的组合,因此已经写入XML文件。若并没有,那个么将该组合添加到列表中并调用您的write方法。通过这种方式,您将跟踪已经写入XML的随机组合,因为您的列表包含一个副本。Person类只是一个容器,可以帮助您更轻松地检查fistname和lastname组合的重复项

 public partial class Form1 : Form
 {
    public Form1()
    {
        InitializeComponent();
    }

    class Person
    {
        public string Name { get; set; }
        public string Lastname { get; set; }
    }

    private void createNode(string pID, string pName, string pSurname, string pAge, XmlTextWriter writer)
    {
        writer.WriteStartElement("Osoba");
        writer.WriteStartElement("Id");
        writer.WriteString(pID);
        writer.WriteEndElement();
        writer.WriteStartElement("Imie");
        writer.WriteString(pName);
        writer.WriteEndElement();
        writer.WriteStartElement("Nazwisko");
        writer.WriteString(pSurname);
        writer.WriteEndElement();
        writer.WriteStartElement("Wiek");
        writer.WriteString(pAge);
        writer.WriteEndElement();
        writer.WriteEndElement();
    }

    private void button1_Click_1(object sender, EventArgs e)
    {
        string[] Imie = { "Anna", "Piotr", "Katarzyna ", "Andrzej", "Małgorzata", "Jan", "Agnieszka ", "Stanisław", "Barbara", "Tomasz", "Marcin", "Marek", "Magdalena", "Łukasz" };
        string[] Nazwisko = { "Wieczorek", "Stępień", "Pawlak", "Baran", "Wróblewski", "Ostrowski", "Zając", "Adamczyk", "Walczak", "Michalak", "Jaworski" };
        Random losuj = new Random();
        List<Person> list = new List<Person>();

        XmlTextWriter writer = new XmlTextWriter("osoby.xml", System.Text.Encoding.UTF8);
        writer.WriteStartDocument(true);
        writer.Indentation = 2;
        writer.WriteStartElement("Osoby");

        for (int i = 0; i < 500; i++)
        {
            var name = Imie[losuj.Next(0, 7)];
            var lastname = Nazwisko[losuj.Next(0, 7)];
            var presentInList = list.Where(p => p.Name == name && p.Lastname == lastname).FirstOrDefault();
            if (presentInList == null)
            {
                list.Add(new Person { Name = name, Lastname = lastname });
                createNode(i.ToString(), name, lastname, losuj.Next(1, 50).ToString(), writer);
            }
        }

        writer.WriteEndElement();
        writer.WriteEndDocument();
        writer.Close();

        MessageBox.Show("Utworzono plik XML,teraz możesz zapisać plik XML do pliku TXT ! ");

    }
}
公共部分类表单1:表单
{
公共表格1()
{
初始化组件();
}
班主任
{
公共字符串名称{get;set;}
公共字符串Lastname{get;set;}
}
私有void createNode(字符串pID、字符串pName、字符串pSurname、字符串页、XmlTextWriter)
{
作者:书面声明(“Osoba”);
writer.writeStarElement(“Id”);
writer.WriteString(pID);
writer.writeedelement();
作者。书面声明(“Imie”);
writer.WriteString(pName);
writer.writeedelement();
作者:书面声明(“纳兹维斯科”);
writer.WriteString(pSurname);
writer.writeedelement();
作者。书面声明(“Wiek”);
writer.WriteString(第页);
writer.writeedelement();
writer.writeedelement();
}
私有无效按钮1\u单击\u 1(对象发送者,事件参数e)
{
字符串[]Imie={“安娜”、“皮奥特”、“卡塔尔兹纳”、“安德烈”、“玛戈尔扎塔”、“扬”、“阿格涅斯卡”、“斯坦尼斯•胡”、“芭芭拉”、“托马斯兹”、“马辛”、“马雷克”、“玛格达莱娜”、“乌卡斯”};
字符串[]Nazwisko={“Wieczorek”、“Stępień”、“Pawlak”、“Baran”、“Wróblewski”、“Ostrowski”、“Zając”、“Adamczyk”、“Walczak”、“Michalak”、“Jaworski”};
Random losuj=新的Random();
列表=新列表();
XmlTextWriter=newXMLTextWriter(“osoby.xml”,System.Text.Encoding.UTF8);
writer.WriteStartDocument(true);
writer.Indentation=2;
writer.WriteStarteElement(“Osoby”);
对于(int i=0;i<500;i++)
{
var name=Imie[losuj.Next(0,7)];
var lastname=Nazwisko[losuj.Next(0,7)];
var presentInList=list.Where(p=>p.Name==Name&&p.Lastname==Lastname).FirstOrDefault();
if(presentList==null)
{
添加(新的人{Name=Name,Lastname=Lastname});
createNode(i.ToString(),name,lastname,losuj.Next(1,50).ToString(),writer);
}
}
writer.writeedelement();
writer.WriteEndDocument();
writer.Close();
Show(“Utworzono plik XML,teraz możesz zapisaćplik XML do pliku TXT!”);
}
}

将人员存储在列表中以进行唯一性测试的缺点是时间复杂度随着
O(n^2)
的增加而增加(循环人员是线性的,而测试是线性的,这与n^2相结合)。要获得线性复杂度
O(n)
请使用
HashSet
(循环人员是线性的,插入时自动完成的测试是常量)

要使用哈希集,请创建Person类并重写
Equals
GetHashCode

public class Person
{
    public string FirstName { get; set; }
    public string LastName { get; set; }

    public override bool Equals(object obj)
    {
        if (obj is Person other) {
            return FirstName == other.FirstName && LastName == other.LastName;
        }
        return false;
    }

    public override int GetHashCode()
    {
        unchecked {
            return 17 * FirstName.GetHashCode() + LastName.GetHashCode();
        }
    }
}
为了简单起见,我没有检查空值

var persons = new HashSet<Person>();

while (persons.Count < 500) {
    var p = new Person { FirsName = ..., LastName = ... };
    persons.Add(p);
}
使用创建和添加元素

var element = new XElement("Osoba",
    new XElement("Id", 1),
    new XElement("Imie", "Jan"),
    new XElement("Nazwisko", "Kowalski"),
    new XElement("Wiek", 23)
);
root.Add(element);
最后用

doc.Save(filename);

您有数组-您可以使用LINQ查询,运算符Distinct()将清除重复项。保留写入XML文件的缓冲区列表,就这样。LINQ willl help.Form1.Person.Name,Form1.Person.Lastname由于其保护级别而无法访问。如何修复它?抱歉,我的邮件我忘记将属性公开。已编辑。好的,可以使用thx…但还有另一个问题:“!”运算符无法应用于“Form1.Person”类型的操作数抱歉,Javascript太多。现在试试。没问题:)这是我在c语言的开始#
doc.Save(filename);