XmlDocument를 문자열로 변환


218

다음은 현재 XMLDocumentString으로 변환하는 방법입니다.

StringWriter stringWriter = new StringWriter();
XmlTextWriter xmlTextWriter = new XmlTextWriter(stringWriter);

xmlDoc.WriteTo(xmlTextWriter);

return stringWriter.ToString();

이 방법의 문제점은 " (속성에있는 인용 부호)가 있으면이를 이스케이프한다는 것입니다.

인스턴스의 경우 :

<Campaign name="ABC">
</Campaign>

위는 예상되는 XML입니다. 그러나 그것은 반환

<Campaign name=\"ABC\">
</Campaign>

String.Replace "\"를 할 수 있지만 그 방법은 괜찮습니까? 부작용이 있습니까? XML 자체에 "\" 가 포함되어 있으면 제대로 작동합니까 ?

답변:


180

따옴표가 없습니다. VS 디버거 일뿐입니다. 콘솔로 인쇄하거나 파일로 저장해보십시오. 참고로 항상 일회용 물체를 폐기하십시오.

using (var stringWriter = new StringWriter())
using (var xmlTextWriter = XmlWriter.Create(stringWriter))
{
    xmlDoc.WriteTo(xmlTextWriter);
    xmlTextWriter.Flush();
    return stringWriter.GetStringBuilder().ToString();
}

2
사용하는 코드를 고정하기위한 한 using블록을하지 XmlTextWriter.
John Saunders

1
XmlWriter의 Close 메소드를 호출 할 때까지 요소 및 속성이 작성되지 않는다는 점에 주목하십시오 (여기서 msdn.microsoft.com/en-us/library/system.xml.xmlwriter.aspx 참조 ).
TonE

그들 중 일부는 즉시 쓰여질 수 있습니다. 버퍼링에 따라 다릅니다. 어쨌든,에 대한 호출을 추가 Flush했지만 블록을 호출 Close하거나 xmlTextWriter using블록을 닫으면 동일하게 수행됩니다.
Brian

12
XML을 예쁘게 만들려면이 설정 개체를 XmlWriter.Create에 전달합니다. XmlWriterSettings settings = new XmlWriterSettings (); settings.Indent = true; settings.IndentChars = ""; settings.Encoding = 인코딩 .UTF8;
Adam Bruss

655

xmlDoc이 XmlDocument 객체라고 가정하면 xmlDoc.OuterXml에 어떤 문제가 있습니까?

return xmlDoc.OuterXml;

OuterXml 속성 은 XML의 문자열 버전을 반환합니다.


3
당신 말이 맞아요 나는 그것을 먼저 시도했지만 디버거에서 따옴표를 볼 때. OuterXml 때문이라고 생각하고 StringWriter 메서드를 사용해보십시오. 그러나 나는 따옴표가 디버거에만 있다고 잘못했습니다. 그냥 OuterXml을 사용하겠습니다. 감사합니다
akif

나를 위해 일했다! xmlDoc에서 null 검사를 수행하십시오! xmlDoc을 반환 == null? "xmlDoc이 널입니다": xmlDoc.OuterXml;
SarjanWebDev

1
@SarjanWebDev 객체가 null 일 수 있다고 생각되면 null-check는 말하지 않고 여기에 모든 대답을합니다. 그리고 실제로 C #에서 객체와의 모든 상호 작용에 대해 개인적으로 객체를 항상 구성하여 null 검사로 코드를 부 풀릴 필요가 없도록하려고합니다 ... 코드베이스에 따라 다릅니다. .
크리스 Moutray

10
(y) 그러나 OuterXml에는 선언적 태그 <? xml version = "1.0"encoding = "utf-16"?>이 포함되어 있지 않습니다
위험

3
선언적 태그를 원한다면 @hazjack XmlDeclaration Class msdn.microsoft.com/en-us/library/system.xml.xmldeclaration.aspx 를 사용하십시오. 파일에 쓰려면 저장 방법을 사용하십시오. 당신을 XmlDocument 인스턴스에 msdn.microsoft.com/en-us/library/dw229a22.aspx - 나에게 선언적 태그는 의미가 있습니다 만약 당신이 파일이 아닌 C #을 문자열 말할 수있는 좋은 방법입니다 쓰기
크리스 Moutray

10

당신이 사용하는 경우 Windows.Data.Xml.Dom.XmlDocument버전 XmlDocument(예를 들어 UWP 응용 프로그램에서 사용)을, 당신이 사용할 수있는 yourXmlDocument.GetXml()문자열로 XML을 얻을 수 있습니다.


5

확장 방법으로 :

public static class Extensions
{
    public static string AsString(this XmlDocument xmlDoc)
    {
        using (StringWriter sw = new StringWriter())
        {
            using (XmlTextWriter tx = new XmlTextWriter(sw))
            {
                xmlDoc.WriteTo(tx);
                string strXmlText = sw.ToString();
                return strXmlText;
            }
        }
    }
}

이제 간단하게 사용하십시오.

yourXmlDoc.AsString()

이 예제는 두 작성자에서 Dispose를 호출하지 못합니다.
Joel Mueller

2

"\"디버거와 같이 표시 되지만 문자열에서 데이터가 정확하므로 아무것도 바꿀 필요가 없습니다. 문자열을 파일로 덤프하면 문자열이 올바른 것입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.