1

別のサービスによって取得および解析される XML ファイルを作成しようとしています。これを行うには、XML を非常に具体的な方法でフォーマットする必要があります。つまり、次のようになります。

<?xml version="1.0"?>
<Feedbacks:Feedbacks xmlns:Feedbacks="Feedbacks">
  <Feedbacks:Elements>
    <Feedback:XMLFeedback xmlns:Feedback="Feedback">
      <Feedback:MfgUnitID></Feedback:MfgUnitID>
      <Feedback:MachineId></Feedback:MachineId>
      <Feedback:OperationCode></Feedback:OperationCode>
      <Feedback:ItemSeqNum></Feedback:ItemSeqNum>
      <Feedback:OperDispositionCd></Feedback:OperDispositionCd>
      <Feedback:ItemId></Feedback:ItemId>
      <Feedback:ParentItemId></Feedback:ParentItemId>
      <Feedback:ItemEndSize>1821</Feedback:ItemEndSize>
      <Feedback:ItemDispositionCd></Feedback:ItemDispositionCd>
      <Feedback:OperStartDate></Feedback:OperStartDate>
      <Feedback:OperEndDate></Feedback:OperEndDate>
    </Feedback:XMLFeedback>
  </Feedbacks:Elements>
</Feedbacks:Feedbacks>

もちろん、最も内側の要素の間にデータがあります。ここに問題がありますが、私が何をしても、最も内側のノードにセミコロンを保持する C# クラスを取得できません。私の知る限り、これらはそのままにしておく必要があるので、C# で強制的にノードをこのようにフォーマットする方法はありますか? XMLDocument クラスにあるすべての作成メソッドを試しました。外側のノードを適切にフォーマットできますが、内側のノードは問題を引き起こし続けます。

編集、申し訳ありませんが、内部ノードを作成するコードは次のとおりです。

private void AppendFile(string filename, string[] headers, Dictionary<string, string> values)
    {
        XmlDocument doc = new XmlDocument();
        doc.Load(filename);
        XmlNode node = doc.GetElementsByTagName(headers[headers.Length - 2]).Item(0);
        string[] hPieces = headers[headers.Length - 1].Split(':');
        XmlElement appendee = doc.CreateElement(hPieces[0].Trim(), hPieces[1].Trim(), hPieces[0].Trim());
        node.AppendChild(appendee);

        foreach (KeyValuePair<string, string> pair in values)
        {
            string[] ePieces = pair.Key.Split(':');
            //XmlElement element = doc.CreateElement(ePieces[0].Trim(), string.Empty, ePieces[1].Trim());
            //XmlText text = doc.CreateTextNode(pair.Value);
            XmlNode innerNode = doc.CreateNode(XmlNodeType.Element, ePieces[1].Trim(), ePieces[0].Trim());
            node.InnerText = pair.Value;
           // element.AppendChild(text);
            appendee.AppendChild(innerNode);
        }

        doc.Save(filename);
    }

内部ノードのデータは、ディクショナリ内のキーと値のペアとして取得されます。キーに意図した名前が含まれている場所。

Edit2:これはファイル出力がどのように見えるかです

<?xml version="1.0" encoding="utf-8"?>
<Feedbacks:Feedbacks xmlns:Feedbacks="Feedbacks">
  <Feedbacks:Elements>
    <Feedback:XMLFeedback xmlns:Feedback="Feedback">
      <MfgUnitID></MfgUnitID>
      <MachineId></MachineId>
      <OperationCode</OperationCode>
      <ItemSeqNum></ItemSeqNum>
      <OperDispositionCd></OperDispositionCd>
      <ItemId></ItemId>
      <ParentItemId></ParentItemId>
      <ItemEndSize></ItemEndSize>
      <ItemDispositionCd></ItemDispositionCd>
      <OperStartDate></OperStartDate>
      <OperEndDate></OperEndDate>
    </Feedback:XMLFeedback>
  </Feedbacks:Elements>
</Feedbacks:Feedbacks>
4

1 に答える 1

2

これは、XLinq を使用して簡単に実現できます。

using System.Xml.Linq;

     XNamespace ns1 = "Feedbacks";
     XNamespace ns2 = "Feedback";

     var doc = new XElement("Feedbacks", 
            new XAttribute(XNamespace.Xmlns+"Feedbacks", ns1));

     doc.Add(new XElement(ns1 + "Elements", 
            new XElement(ns2 + "Feedback", 
               new XAttribute(XNamespace.Xmlns+"Feedback", ns2),
               new XElement(ns2 + "Unit"))));

与える

<Feedbacks xmlns:Feedbacks="Feedbacks">
  <Feedbacks:Elements>
    <Feedback:Feedback xmlns:Feedback="Feedback">
      <Feedback:Unit />
    </Feedback:Feedback>
  </Feedbacks:Elements>
</Feedbacks>

独自の出力は有効な XML である必要があると思いますが、親の名前 pcae に依存しています。

于 2012-08-15T19:48:11.803 に答える