0

以前にこの質問に回答してもらいましたが、xmlコードの形式を少し良くするように変更しました。私はこれに不慣れですが、質問があります:以下は実行時に書かれています。必要なものはすべて追加できますが、PPE / ppe /UID"A3"の前に要素を追加したい場合は失われます。以下は私が持っているものです:

<?xml version="1.0" encoding="utf-8"?>
<Project>
  <Details>
    <details>
      ///....more specific data
    </details>
  </Details>
  <Tools />
  <Materials />
  <PPE>
    <ppe>
      <UID>A1</UID>
      <ppe1Bool>true</ppe1Bool>
      <ppe1>Test A1</ppe1>
      <ppe2Bool>true</ppe2Bool>
      <ppe2>....</ppe2>
    </ppe>
    <ppe>
      <UID>A3</UID>
      <ppe1Bool>true</ppe1Bool>
      <ppe1>Test A3</ppe1>
      <ppe2Bool>true</ppe2Bool>
      <ppe2>....</ppe2>
    </ppe>
  </PPE>
  <Video />
  <Links />
</Project>

これは私が追加する必要があるものであり、A3の前にある必要があります

<?xml version="1.0" encoding="utf-8"?>
<Project>
  <Details>
    <details>
      ///....more specific data
    </details>
  </Details>
  <Tools />
  <Materials />
  <PPE>
    <ppe>
      <UID>A1</UID>
      <ppe1Bool>true</ppe1Bool>
      <ppe1>Test A1</ppe1>
      <ppe2Bool>true</ppe2Bool>
      <ppe2>....</ppe2>
    </ppe>
    //////////////////////////////
    <ppe>
      <UID>A2</UID>
      <ppe1Bool>true</ppe1Bool>
      <ppe1>New</ppe1>
      <ppe2Bool>true</ppe2Bool>
      <ppe2>....</ppe2>
    </ppe>
    /////////////////////////////
    <ppe>
      <UID>A3</UID>
      <ppe1Bool>true</ppe1Bool>
      <ppe1>Test A3</ppe1>
      <ppe2Bool>true</ppe2Bool>
      <ppe2>....</ppe2>
    </ppe>
  </PPE>
  <Video />
  <Links />
</Project>

これが私のコードです。私は近くにいますが、完全ではありません。

     public static void insertRBRowPPE(string strSelection, string strFileName)
     {
        System.Guid desiredGuid = System.Guid.NewGuid(); //I changed this line to A1..A2..A3 for
                                                         //clarity
        XmlDocument xmlDoc = new XmlDocument();
        xmlDoc.Load(strFileName);
        XmlNode node = xmlDoc.SelectSingleNode("Project/PPE/ppe");
        try
        {
            XElement doc = XElement.Load(strFileName);
            foreach (XElement elm in doc.Elements("PPE"))
            {
                if (node["UID"].InnerText == strSelection)
                {
                    elm.AddBeforeSelf(new XElement("ppe", new XElement("UID", desiredGuid),
                        new XElement("ppe1Bool", ""), new XElement("ppe1", "New"), new XElement("ppe2Bool", ""),
                        new XElement("ppe2", "")));
                }
            }
            doc.Save(strFileName);

        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.ToString());
        }
    }

だから..バグのある結果はこれです:

   ///xml code etc...
  <Materials />
  <ppe>////////////////////here but I dont want it here
    <UID>A2</UID>
    <ppe1Bool>true</ppe1Bool>
    <ppe1>New</ppe1>
    <ppe2Bool>true</ppe2Bool>
    <ppe2>....</ppe2>
  </ppe>//////////////////////////////
  <PPE>
    <ppe>
      <UID>A1</UID>
      <ppe1Bool>true</ppe1Bool>
      <ppe1>Test A1</ppe1>
      <ppe2Bool>true</ppe2Bool>
      <ppe2>....</ppe2>
    </ppe>
    //////////////////////////////
    I want it here....
    /////////////////////////////
    <ppe>
      <UID>A3</UID>
      <ppe1Bool>true</ppe1Bool>
      <ppe1>Test A3</ppe1>
      <ppe2Bool>true</ppe2Bool>
      <ppe2>....</ppe2>
    </ppe>
  </PPE>
  <Video />
  /// xml code etc....

そこにあるすべての才能の助けはありますか?ありがとう!!

4

2 に答える 2

1

あなたの前の質問に答えを適応させる:

public static void insertRowBeforRowPPE(string strSelection, string strFileName)
{

  XElement doc=XElement.Load(strFileName);
  XElement project = doc.Element("Project");
  XElement ppe = project.Element("PPE");
  foreach(XElement elm in ppe.Elements("ppe")
  {
    if(elm.Element("UID").Value==strSelection)
      elm.AddBeforeSelf(new XElement("PPE",new XElement("UID","a2")));
      //adds PPE node having UID element with value a2 just before the required node
  }
  doc.Save(strFileName);
}

Projectさらにいくつかのチェックを追加したい場合があることに注意してください。たとえば、XMLに要素が含まれていない場合、このコードはクラッシュします。

于 2012-12-02T22:20:37.013 に答える
0

MiMo、ありがとう!一度見たら簡単!私はあなたのアップデートから1行をコメントアウトしました、そしてそれは良いです。再度、感謝します!

             //Those who may be interested
            //XElement project = doc.Element("Project");
            XElement ppe = doc.Element("PPE");
            foreach(XElement elm in ppe.Elements("ppe"))
            {
                if (elm.Element("UID").Value == strSelection)
于 2012-12-03T23:36:08.797 に答える