[c#] XmlDocument에서 줄 바꿈을 사용하여 들여 쓰기 된 XML을 얻는 가장 간단한 방법은 무엇입니까?

나는 처음부터 XML을 구축 할 때 XmlDocumentOuterXml속성은 이미 잘 줄 바꿈과 들여 모든 것을 갖추고 있습니다. 그러나 LoadXml매우 “압축 된”XML (줄 바꿈이나 들여 쓰기 없음)을 호출 하면 출력이 OuterXml그대로 유지됩니다. 그래서 …

의 인스턴스에서 아름다운 XML 출력을 얻는 가장 간단한 방법은 무엇입니까 XmlDocument?



답변

다른 답변을 바탕으로 XmlTextWriter다음 도우미 방법을 조사 하고 생각해 냈습니다.

static public string Beautify(this XmlDocument doc)
{
    StringBuilder sb = new StringBuilder();
    XmlWriterSettings settings = new XmlWriterSettings
    {
        Indent = true,
        IndentChars = "  ",
        NewLineChars = "\r\n",
        NewLineHandling = NewLineHandling.Replace
    };
    using (XmlWriter writer = XmlWriter.Create(sb, settings)) {
        doc.Save(writer);
    }
    return sb.ToString();
}

내가 기대했던 것보다 약간 더 많은 코드지만, 그냥 복숭아처럼 작동합니다.


답변

Erika Ehrli의 블로그 에서 채택한대로 다음 과 같이해야합니다.

XmlDocument doc = new XmlDocument();
doc.LoadXml("<item><name>wrench</name></item>");
// Save the document to a file and auto-indent the output.
using (XmlTextWriter writer = new XmlTextWriter("data.xml", null)) {
    writer.Formatting = Formatting.Indented;
    doc.Save(writer);
}


답변

Linq에 액세스 할 수 있으면 더 쉽습니다.

try
{
    RequestPane.Text = System.Xml.Linq.XElement.Parse(RequestPane.Text).ToString();
}
catch (System.Xml.XmlException xex)
{
            displayException("Problem with formating text in Request Pane: ", xex);
}


답변

더 짧은 확장 메서드 버전

public static string ToIndentedString( this XmlDocument doc )
{
    var stringWriter = new StringWriter(new StringBuilder());
    var xmlTextWriter = new XmlTextWriter(stringWriter) {Formatting = Formatting.Indented};
    doc.Save( xmlTextWriter );
    return stringWriter.ToString();
}


답변

XmlDocument이미 XmlProcessingInstruction자식 노드가 포함 된에 대해 위의 Beautify 메서드가 호출 되면 다음 예외가 발생합니다.

XML 선언을 작성할 수 없습니다. WriteStartDocument 메서드가 이미 작성했습니다.

이것은 예외를 제거하기 위해 원래 버전의 수정 된 버전입니다.

private static string beautify(
    XmlDocument doc)
{
    var sb = new StringBuilder();
    var settings =
        new XmlWriterSettings
            {
                Indent = true,
                IndentChars = @"    ",
                NewLineChars = Environment.NewLine,
                NewLineHandling = NewLineHandling.Replace,
            };

    using (var writer = XmlWriter.Create(sb, settings))
    {
        if (doc.ChildNodes[0] is XmlProcessingInstruction)
        {
            doc.RemoveChild(doc.ChildNodes[0]);
        }

        doc.Save(writer);
        return sb.ToString();
    }
}

이제 저에게 효과적입니다 XmlProcessingInstruction. 첫 번째 노드뿐만 아니라 모든 하위 노드에서 노드를 검색해야 할까요?


2015 년 4 월 업데이트 :

인코딩이 잘못된 또 다른 경우가 있었기 때문에 BOM없이 UTF-8을 적용하는 방법을 찾았습니다. 이 블로그 게시물을 발견 하고이를 기반으로 함수를 만들었습니다.

private static string beautify(string xml)
{
    var doc = new XmlDocument();
    doc.LoadXml(xml);

    var settings = new XmlWriterSettings
    {
        Indent = true,
        IndentChars = "\t",
        NewLineChars = Environment.NewLine,
        NewLineHandling = NewLineHandling.Replace,
        Encoding = new UTF8Encoding(false)
    };

    using (var ms = new MemoryStream())
    using (var writer = XmlWriter.Create(ms, settings))
    {
        doc.Save(writer);
        var xmlString = Encoding.UTF8.GetString(ms.ToArray());
        return xmlString;
    }
}


답변

XmlTextWriter xw = new XmlTextWriter(writer);
xw.Formatting = Formatting.Indented;


답변

    public static string FormatXml(string xml)
    {
        try
        {
            var doc = XDocument.Parse(xml);
            return doc.ToString();
        }
        catch (Exception)
        {
            return xml;
        }
    }