2012-08-15 101 views
1

我正在嘗試編寫一個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

回答

2

您可以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

相關問題