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,依赖于父命名空间。

于 2012-08-15T19:48:11.803 回答