2014-06-16 5 views
0

을 덮어 쓰기 :나는 다음과 같은 형식의 XML 파일이 특정 XML 노드

<Alarms> 
    <Alarm> 
     <Id>1</Id> 
     <Severity>Warning</Severity> 
     <Comments></Comments> 
    </Alarm> 
    <Alarm> 
     <Id>2</Id> 
     <Severity>Error</Severity> 
     <Comments>Restart the machine</Comments> 
    </Alarm> 
    ... 

내 프로그램이 사용자에게 알람의 Comments을 편집 할 수있는 기능을 제공하는 GUI를 가지고 있습니다. 사용자가 편집을 마치고 변경 사항을 저장하려고 할 때 수행 할 작업에 가장 적합한 솔루션을 찾으려고합니다. XML 파일은 극단적으로 크지 않습니다 (데이터베이스를 보증하지는 않지만). 단일 알람으로 변경 될 때마다 전체 내용을 덮어 쓰지 않으려는만큼 충분히 큽니다. 특정 노드 만 타겟팅하고 Comments 속성을 편집 할 필요없이 모든 것을 다시 쓸 수 있습니까?

XML 관련 솔루션을 찾고 있는데 ... 파일의 특정 줄로 이동 한 다음 해당 줄을 편집하는 것과 같은 일반적인 플랫 파일 방식을 사용하지 않으려합니다. 아마도 XML 파일에 대해 내가 관심이없는 무언가가 존재할 수도 있습니다. 현재 .NET 2 프로젝트로 작업 중이지만 곧 4.5로 업그레이드 할 예정입니다. 따라서 모든 솔루션이 나에게 적합합니다.

답변

1

XmlDocument 클래스에서 xml을로드 할 수 있습니다. 편집하려는 주석 노드로 XPath 쿼리로 이동하고 값을 변경합니다. 완료되면 문서를 동일한 파일 이름이나 다른 파일 이름으로 저장하십시오.

다음은 콘솔 응용 프로그램을 사용한 예입니다. https://dotnetfiddle.net/eQROet

+0

당신이'XmlDocument.Save()'의 내부 동작을 알고 있습니까 : 여기

// The Id of the Alarm to edit int idToEdit = 2; // The new comment for the Alarm string newCommentValue = "Here is a new comment"; XmlDocument doc = new XmlDocument(); doc.LoadXml(xml); XmlNode commentsElement = doc.SelectSingleNode(String.Format("Alarms/Alarm[Id = '{0}']/Comments", idToEdit)); commentsElement.InnerText = newCommentValue; doc.Save(Console.Out); 

는 작업 바이올린입니까? 서로 다른 작성자 (http://msdn.microsoft.com/en-us/library/system.xml.xmldocument.save(v=vs.110).aspx)를 사용하는 오버로드가 몇 가지 있습니다. 내 유스 케이스에 대해 가장 효율적이다. – valsidalv

+0

파일 경로에 문서 내용을 저장하는 문자열을 사용하는 오버로드가 필요할 수 있습니다. 이렇게하면 결국 전체 파일을 디스크에 다시 쓰게되고 실제로 큰 문제는 아닙니다. 전체 파일을 디스크에 기록하는 데 관심이 있다면 각 알람을 파일 이름에 알람 ID가있는 별도의 파일로 저장하십시오. 이 방법은 파일을 수정할 때 변경 사항을 하나의 알람에 저장하는 것입니다. –

관련 문제