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

问题描述:

我正在尝试编写一个XML文件,该文件将被另一个服务拾取并解析。为了发生这种情况,XML必须以非常特定的方式格式化,即:保留C#中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> 
+0

那么*会发生什么?你能显示你的代码吗?我不希望.NET解析器丢掉命名空间信息... – 2012-08-15 18:51:57

+0

你有没有试过XSD.exe?您可以使用XSD.exe解析所需的xml,它将生成一个可以序列化的C#类... – jle 2012-08-15 18:52:04

+2

这些都是XML命名空间,或者它们看起来像是这样。它们在XML中具有特定的含义,这就是为什么你需要使用batty行为; XMLDocument将它们视为名称空间,而不是XML标签的一部分。 – 2012-08-15 18:52:07

您可以XLINQ容易accompish这样的:

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,依靠父级namespcae。

+0

这可能工作,但我需要瞄准.NET 2.0,我认为这些类只有3.5和以上。 – Pat 2012-08-16 01:10:38

+0

原来我可以使用3.5,所以这将工作。 – Pat 2012-08-16 17:59:32