2012-08-28 5 views
0

XML 파일에 새 노드를 추가하는 코드가 있으며 완벽하게 작동하지만 추가시 변경 사항을 저장할 때 xml 파일의 원래 구조가 변경됩니다.원본 구조를 잃지 않고 XML 노드를 추가하는 방법은 무엇입니까?

은 원래 파일은 다음과 같이 각 노드에 전체 라인 또는 행이 있습니다

<DATA> 
    <ROW><mk v = "2801"/><gd v = "170300"/><wn v = "00Y6354"/><bn v = ""/></ROW> 
    <ROW><mk v = "2801"/><gd v = "170301"/><wn v = "00Y6355"/><bn v = ""/></ROW> 
    <ROW><mk v = "2801"/><gd v = "170302"/><wn v = "00Y6356"/><bn v = ""/></ROW> 
</DATA> 

하지만 새로운 노드를 추가하고 변경 사항을 저장 한 후를 구조는 다음과 같습니다 : 나는했습니다

<DATA> 
    <ROW> 
     <mk v = "2801"/> 
     <gd v = "170300"/> 
     <wn v = "00Y6354"/> 
     <bn v = ""/> 
    </ROW> 
    <ROW> 
     <mk v = "2801"/> 
     <gd v = "170301"/> 
     <wn v = "00Y6355"/> 
     <bn v = ""/> 
    </ROW> 
    <ROW> 
     <mk v = "2801"/> 
     <gd v = "170302"/> 
     <wn v = "00Y6356"/> 
     <bn v = ""/> 
    </ROW> 
    <ROW> 
     <mk v = "2341"/> 
     <gd v = "170342"/> 
     <wn v = "00Y9872"/> 
     <bn v = "new node"/> 
    </ROW> 
</DATA> 

첫 번째 구조처럼 FINAL OUTPUT을 사용하여 몇 가지 예제를 찾으려고 시도했지만 아무것도 표시하지 않았습니다. 따라서 원래 구조를 변경하지 않고 변경 사항을 저장하는 것이 가능합니다.

내 코드는 다음과 같다 :

public void CreateXML(string[] ipRow, string ipFile) 
    { 
     XmlDocument doc = new XmlDocument(); 
     XmlDocument xmlDoc = new XmlDocument(); 
     xmlDoc.Load(ipFile); 

     for (int j = 0; j < ipRow.Length; j++) 
     { 
      doc.LoadXml(ipRow[j]); 
      XmlNode newNode = doc.DocumentElement; 
      XmlNode copiedNode = xmlDoc.ImportNode(newNode, true); 
      xmlDoc.DocumentElement.LastChild.AppendChild(copiedNode);     
     } 
     xmlDoc.Save(ipFile); 
    } 

난 그냥 형식의 일종을 적용 할, 또는 적어도 파일 안에 이미 무엇의 원래 구조를 존중하는 프로그램을 나타냅니다. StringBuilders, XmlWriterSettings 및 stuff를 사용할 수 있지만 작동하지 않는다고 말하는 포럼을 발견했습니다. 알 수 있듯이 새로운 노드는 문자열에서 비롯된 것이므로 변경할 방법이 없습니다. 새 노드가 만들어지면 코드를 그대로 유지하고 원래 형식을 유지하는 규칙을 추가하기 만하면됩니다.

누군가 Visual Studio 2008에서 C#으로이 작업을 수행 할 수 없다는 것을 알고있는 경우 (필자는 명백한 전문가 만 신뢰할 것입니다).

답장을 보내주세요. 감사.

+0

가능한 복제본 http://stackoverflow.com/questions/8589592/preserve-xml-formatting-using-xmldocument – jpe

+0

저는 이미 preservewhitespace를 시도해 봤는데 작동하지 않습니다. 그 결과는 someting입니다. 이 같은 <= "2801"/ MK의 V> = "170301"> 단 하나의 행 LL XML 코드, 나는 그것을 찾고 있지 않다 –

+0

왜이 특정 형식이 필요합니까? XML 파일에서 형식이 중요하다는 것은 매우 드문 일입니다. – JcFx

답변

1

다른 곳에서 들었을 수있는 내용이 반복 될 위험이 있으므로 XmlDocument를 저장하면이 작업을 수행 할 수 없습니다.

using (var xmlWriter = new XmlTextWriter(filePath, Encoding.UTF8)) 
{ 
    xmlWriter.Formatting = Formatting.None; 
    yourDocument.WriteTo(xmlWriter); 
} 

을 ...하지만 나는 당신에게 당신이 찾고있는 매우 구체적인 레이아웃을 줄 것이다 있는지 확실하지 않습니다 : 당신은 XmlTextWriter의를 사용하여 시도 할 수 있습니다.

또는 전체 문서를 yourDocument.OuterXml을 사용하여 문자열로 가져온 다음 <ROW> 노드 전후의 문자를 제외한 모든 캐리지 리턴을 제거하려면 일반 문자열 일치 (REGEX가 가장 좋음)를 사용할 수 있습니다.

파일 구성에 실제 차이가 없다는 것을 명심하십시오. 형식 지정의 경우 일뿐입니다.

관련 문제