2014-02-18 66 views
3

我有一個這樣的XML文件:創建或XML代替節點沒有根在C#

<Something>....</Something> 
<Another>....</Another> 
<Other>...</Other> 

而且這個XML文件還沒有一個根元素(我知道這是一個錯誤的XML格式)。

我需要創建或替換,如果已經存在此XML節點,但我不能用XDocumentXmlDocument工作,因爲他們需要一個根元素的工作,我不能根元素添加到這個XML,因爲我不能改變更多的代碼在應用程序(Windows窗體應用程序)中。 我有什麼選擇來執行此操作?

編輯1: 使用@chridam示例我有這種方法,但它取代了整個XML ...我需要更改什麼?

public void ReEscribirNodoXML(string pathXml, string nodoName, string nodeContent) 
     { 
      if (File.Exists(pathXml)) 
      { 
       XmlValidatingReader vr = new XmlValidatingReader(pathXml, XmlNodeType.Element, null); 
       while (vr.Read()) 
        Debug.WriteLine("NodeType: {0} NodeName: {1}", vr.NodeType, vr.Name); 

       XmlWriterSettings settings = new XmlWriterSettings(); 
       settings.Indent = true; 
       settings.OmitXmlDeclaration = true; 
       settings.NewLineOnAttributes = true; 

       var writer = XmlWriter.Create(pathXml, settings); 
       writer.WriteStartElement(nodoName); 
       writer.WriteRaw(nodeContent); 
       writer.WriteEndElement(); 

       writer.Flush(); 
      } 
      else 
      { 
       throw new Exception("i#Error"); 
      } 
     } 
+0

如何''.....樣子?它是多行xml數據還是每個元素在文件中表示爲單行? –

+0

'.....'是單行,但是新元素(或者已經存在並且應該被替換)是多行的。 –

回答

3

可以通過簡單地提供框架來使用Xdocument,然後在完成時丟棄該框架

這裏是片段進去,做出了改變,一個新的節點加入和片段走出去:

var fragment = @"<Something>abc</Something> 
<Another>def</Another> 
<Other>ghi</Other>"; 

var xDoc = XDocument.Parse("<TempRoot>" + fragment + "</TempRoot>"); 

xDoc.Descendants("Another").First().Value = "Jabberwocky"; 
xDoc.Root.Add(new XElement("Omega", "Man")); 

var fragOut = 
    string.Join(Environment.NewLine, xDoc.Root 
             .Elements() 
             .Select (ele => ele.ToString())); 

Console.WriteLine (fragOut); 
/* Prints out 
<Something>abc</Something> 
<Another>Jabberwocky</Another> 
<Other>ghi</Other> 
<Omega>Man</Omega> 
*/ 
+1

似乎對我很好。有一點需要注意 - 存在'xDoc.Root',你可以使用它來代替'xDoc.Element(「Root」)' –

+0

@SergeyBerezovskiy你是一個很棒的點。我會更新它來反映這一點。 – OmegaMan

0

您可以使用http://msdn.microsoft.com/en-us/library/system.xml.xmldocumentfragment%28v=vs.110%29.aspx來處理這樣的片段,例如,現在

XmlDocument doc = new XmlDocument(); 
XmlDocumentFragment frag = doc.CreateDocumentFragment(); 
frag.InnerXml = @"<Something>....</Something> 
<Another>....</Another> 
<Other>...</Other>"; 

您可以使用DOM方法(如AppendChild)或屬性(比如InnerText)訪問節點在文檔片段與ChildNodesSelectNodesSelectSingleNode等和操作節點。

+0

我一直有問題,XML是在一個文件中,而不是在一個字符串中...我如何打開該文件並獲取字符串來執行您的代碼? –

+0

使用http://msdn.microsoft.com/en-us/library/ms143368%28v=vs.110%29.aspx例如'string fragXml = File.ReadAllText(「fragment.xml」);'then'frag.InnerXml = fragXml;'。 –

1

如果您無法使用DOM操作XML,您的選擇是文本操作工具。嘗試使用 正則表達式來查找您需要的節點,然後使用字符串操作例程刪除文本。 但是,將源元素添加到源文本是使DOM工作的一種簡單方法。 您可以稍後在處理XML後將其刪除。