在C#中的XML元素上保留冗余命名空间前缀

时间:2012-08-15 18:48:38

标签: c# xml visual-studio

我正在尝试编写一个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>

1 个答案:

答案 0 :(得分: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,依赖于父命名空间。