Keeping Redundant Namespace Prefixes On XML Elements in C#

I'm trying to write an XML file that will be picked up and parsed by another service. In order for this to happen the XML must be formatted in a very specific way, namely:

<?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>

with data of course between the innermost elements. Here's the issue though, no matter what I do, I can't get any of the C# classes to keep the semicolons on the innermost nodes. As far as I know these need to stay, so is there a way in C# to force it to format the nodes this way? I've tried all of the create methods that I could find in the XMLDocument class. I can get the outer nodes formatted fine, but the inner ones just keep creating problems.

Edit, sorry here's the code that makes the inner nodes.

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);
    }

The data for the inner nodes comes in as key value pairs in the dictionary. Where the keys contain the intended name.

Edit2: This is what the file output looks like

<?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>

You can accompish this easily with 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"))));

Gives

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

Although I believe that your own output should be valid XML, relying on the parent namespcae.

链接地址: http://www.djcxy.com/p/66002.html

上一篇: .NET,XML和InnerXml中的注释

下一篇: 在C#中的XML元素上保留冗余名称空间前缀