0

こんにちは私はあなたのスーパーヘルプが必要です。私はC#にあまり熟練しておらず、これで約6時間スタックします。だから誰かが私を助けてくれることを知っているならお願いします。どうも

私はこのようなXmlを持っています

<COREBASE>
  <AGENT>
    <AGENT_INDEX>1</AGENT_INDEX>
    <AGENT_PORTER_INDEX>
    </AGENT_PORTER_INDEX>
    <AGENT_NAME>John</AGENT_NAME>
    <AGENT_SURNAME>Smith</AGENT_SURNAME>
    <AGENT_MOBILE_NUMBER>777777777</AGENT_MOBILE_NUMBER>
 </AGENT>
  <AGENT>
    <AGENT_INDEX>2</AGENT_INDEX>
    <AGENT_PORTER_INDEX>1
    </AGENT_PORTER_INDEX>
    <AGENT_NAME>Charles</AGENT_NAME>
    <AGENT_SURNAME>Bukowski</AGENT_SURNAME>
    <AGENT_MOBILE_NUMBER>99999999</AGENT_MOBILE_NUMBER>
 </AGENT>
</COREBASE>

そして、Windowsフォームコンボボックスでインデックスによってエージェントを選択し、彼の属性を編集してxmlに保存する必要があります。編集して保存する方法を見つけましたが、理由はわかりませんが、最初のエージェントに保存され、XMLで属性を上書きしますが、選択したエージェントでは上書きしません。..:-(

Plese私はどんな助けでも喜んでいます

private void buttonEditAgent_Click(object sender, EventArgs e)
{
    XmlDocument AgentBaseEdit = new XmlDocument();
    AgentBaseEdit.Load("AgentBase.xml");

    XDocument AgentBase = XDocument.Load("AgentBase.xml");

    var all = from a in AgentBase.Descendants("AGENT")
              select new
              {
                  agentI = a.Element("AGENT_INDEX").Value,
                  porterI = a.Element("AGENT_PORTER_INDEX").Value,
                  agentN = a.Element("AGENT_NAME").Value,
                  agentS = a.Element("AGENT_SURNAME").Value,
                  agentM = a.Element("AGENT_MOBILE_NUMBER").Value,

              };

    foreach (var a in all)
    {
        if ("" == textBoxEditAgentIndex.Text.ToString())
        {
            MessageBox.Show("You must fill Agent Index field !!", "WARNING");
        }
        else
        {
           // AgentBaseEdit.SelectSingleNode("COREBASE/AGENT/AGENT_INDEX").InnerText == textBoxEditAgentIndex.Text

            if (a.agentI == textBoxEditAgentIndex.Text.ToString())
            {
                AgentBaseEdit.SelectSingleNode("COREBASE/AGENT/AGENT_INDEX").InnerText = textBoxEditAgentIndex.Text;
                AgentBaseEdit.SelectSingleNode("COREBASE/AGENT/AGENT_PORTER_INDEX").InnerText = textBoxEditAgentPorterIndex.Text;
                AgentBaseEdit.SelectSingleNode("COREBASE/AGENT/AGENT_NAME").InnerText = textBoxEditAgentName.Text;
                AgentBaseEdit.SelectSingleNode("COREBASE/AGENT/AGENT_SURNAME").InnerText = textBoxEditAgentSurname.Text;
                AgentBaseEdit.SelectSingleNode("COREBASE/AGENT/AGENT_MOBILE_NUMBER").InnerText = textBoxEditAgentMobile.Text;

                AgentBaseEdit.Save("AgentBase.xml");
                ClearEditAgentTxtBoxes();
            }
        }
    }
}                

私は正しい道を進んでいますが、ドアが見えませんか、それとも完全に間違っていますか?すべてのThx。巫女

OK私はこの方法で試しましたが、内部のテキストは変更されませんでした

string agentIndex = comboBoxEditAgentI.SelectedItem.ToString();

        XmlDocument AgentBaseEdit = new XmlDocument();
        AgentBaseEdit.Load("AgentBase.xml");

        XDocument AgentBase = XDocument.Load("AgentBase.xml");

        var xElemAgent = AgentBase.Descendants("AGENT")
            .First(a => a.Element("AGENT_INDEX").Value == agentIndex);



        xElemAgent.Element("AGENT_MOBILE_NUMBER").Value = textBoxEditAgentMobile.Text;
        xElemAgent.Element("AGENT_SURNAME").Value = textBoxEditAgentSurname.Text;

        AgentBaseEdit.Save("AgentBase.xml");
4

2 に答える 2

0

Linq2Xmlを使用すると簡単になります。

int agentIndex = 2;

XDocument xDoc = XDocument.Load(filename);

var xElemAgent = xDoc.Descendants("AGENT")
                .First(a => a.Element("AGENT_INDEX").Value == agentIndex.ToString());

//or
//var xElemAgent = xDoc.XPathSelectElement(String.Format("//AGENT[AGENT_INDEX='{0}']",agentIndex));

xElemAgent.Element("AGENT_MOBILE_NUMBER").Value = "5555555";

xDoc.Save(fileName)

PS:名前空間:System.Xml.XPath System.Xml.Linq

于 2012-12-29T18:28:10.300 に答える
0

各ループで最初のエージェントを明示的に選択しているため、機能しません

AgentBaseEdit.SelectSingleNode("COREBASE/AGENT/...")

ただし、同じxmlドキュメントを読んで変更することで、より簡単に行うことができます。エージェント名を変更して「test1」、「test 2」、...に置き換えるだけです。

XDocument AgentBase = XDocument.Load("AgentBase.xml");
int i = 0;
foreach (XElement el in AgentBase.Descendants("AGENT")) {
    el.Element("AGENT_NAME").Value = "test " + ++i;
    // ...
}
AgentBase.Save("AgentBase.xml");

アップデート

ただし、XML処理に関連するロジックをフォームから分離することをお勧めします。エージェントクラスを作成することから始めます

public class Agent
{
    public string Index { get; set; }
    public string PorterIndex { get; set; }
    public string Name { get; set; }
    public string Surname { get; set; }
    public string Mobile { get; set; }
}

次に、エージェントリポジトリに必要な機能を定義するインターフェイスを作成します。このインターフェースの利点は、後でリレーショナルデータベースなどの別の種類のリポジトリに簡単に切り替えることができることです。

public interface IAgentRepository
{
    IList<Agent> LoadAgents();
    void Save(IEnumerable<Agent> agents);
}

次に、エージェントを処理するクラスを作成します。ここに提案があります:

public class AgentXmlRepository : IAgentRepository
{
    private string _xmlAgentsFile;

    public AgentXmlRepository(string xmlAgentsFile)
    {
        _xmlAgentsFile = xmlAgentsFile;
    }

    public IList<Agent> LoadAgents()
    {
        XDocument AgentBase = XDocument.Load(_xmlAgentsFile);
        var agents = new List<Agent>();
        foreach (XElement el in AgentBase.Descendants("AGENT")) {
            var agent = new Agent {
                Index = el.Element("AGENT_INDEX").Value,
                PorterIndex = el.Element("AGENT_PORTER_INDEX").Value,
                Name = el.Element("AGENT_NAME").Value,
                Surname = el.Element("AGENT_SURNAME").Value,
                Mobile = el.Element("AGENT_MOBILE_NUMBER").Value
            };
            agents.Add(agent);
        }
        return agents;
    }

    public void Save(IEnumerable<Agent> agents)
    {
        var xDocument = new XDocument(
            new XDeclaration("1.0", "utf-8", null),
            new XElement("COREBASE",
                agents.Select(a =>
                    new XElement("AGENT",
                        new XElement("AGENT_INDEX", a.Index),
                        new XElement("AGENT_PORTER_INDEX", a.PorterIndex),
                        new XElement("AGENT_NAME", a.Name),
                        new XElement("AGENT_SURNAME", a.Surname),
                        new XElement("AGENT_MOBILE_NUMBER", a.Mobile)
                    )
                )
            )
        );
        xDocument.Save(_xmlAgentsFile);
    }
}

これで、フォームを編集ロジックに集中させることができます。フォームコンストラクターにリポジトリーを挿入する場合、フォームは使用するリポジトリーの種類を知る必要さえありません(フォームコンストラクターはタイプのパラメーターを宣言する必要がありますIAgentRepository)。

var myAgentForm = new AgentForm(new AgentXmlRepository("AgentBase.xml"));
myAgentForm.Show();

更新#2

XMLファイル内の単一のアイテムを変更することはできないことに注意してください。1つのエージェントのみを編集した場合でも、すべてのエージェントをロードし、編集してから、ファイル全体を書き換える必要があります。

これを行うには、私のLoadAgentsメソッドを使用して、返されたリストからエージェントを選択し、エージェントを編集して、最後に私のSaveメソッドを使用してエージェントリストをファイルに書き戻します。LINQを使用すると、リストからエージェントを見つけることができます。

Agent a = agents
    .Where(a => a.Index == x)
    .FirstOrDefault();

nullこれは、必要なインデックスを持つエージェントが存在しない場合に返されます。は参照型なのでAgent、リストに書き戻す必要はありません。リストは、変数と同じエージェントへの参照を保持していますa

于 2012-12-29T18:38:13.313 に答える