XDocument.ToString ()이 XML 인코딩 태그를 삭제합니다.


103

toString () 함수에서 xml 인코딩을 얻는 방법이 있습니까?

예:

xml.Save("myfile.xml");

~으로 이끌다

<?xml version="1.0" encoding="utf-8"?>
<Cooperations>
  <Cooperation>
    <CooperationId>xxx</CooperationId>
    <CooperationName>Allianz Konzern</CooperationName>
    <LogicalCustomers>

그러나

tb_output.Text = xml.toString();

다음과 같은 출력으로 이어집니다.

<Cooperations>
  <Cooperation>
    <CooperationId>xxx</CooperationId>
    <CooperationName>Allianz Konzern</CooperationName>
    <LogicalCustomers>
    ...

답변:


98

선언을 명시 적으로 작성하거나 a StringWriter및 호출을 사용 하십시오 Save().

using System;
using System.IO;
using System.Text;
using System.Xml.Linq;

class Test
{
    static void Main()
    {
        string xml = @"<?xml version='1.0' encoding='utf-8'?>
<Cooperations>
  <Cooperation />
</Cooperations>";

        XDocument doc = XDocument.Parse(xml);
        StringBuilder builder = new StringBuilder();
        using (TextWriter writer = new StringWriter(builder))
        {
            doc.Save(writer);
        }
        Console.WriteLine(builder);
    }
}

확장 방법으로 쉽게 추가 할 수 있습니다.

public static string ToStringWithDeclaration(this XDocument doc)
{
    if (doc == null)
    {
        throw new ArgumentNullException("doc");
    }
    StringBuilder builder = new StringBuilder();
    using (TextWriter writer = new StringWriter(builder))
    {
        doc.Save(writer);
    }
    return builder.ToString();
}

이것은 선언 이 없으면 충돌하지 않는다는 장점이 있습니다. :)

그런 다음 다음을 사용할 수 있습니다.

string x = doc.ToStringWithDeclaration();

.NET의 암시 적 인코딩이기 때문에 utf-16을 인코딩으로 사용 StringWriter합니다. StringWriter 들어 항상 UTF-8을 사용 하는 것과 같이의 하위 클래스를 생성하여 직접 영향을 미칠 수 있습니다 .


14
이것은 저장을 수행 할 때 XDocument 선언의 인코딩이 무시되고 StringWriter의 인코딩으로 대체된다는 점에서 작은 문제가 있습니다.이 인코딩은 원하는 것일 수도 있고 아닐 수도 있습니다
Sam Holder

2
그런 다음 확장 방법을 다음과 결합합니다 . stackoverflow.com/a/1564727/75963의 Utf8StringWriter ;)
Nick Josevski

12
위의 확장 메서드를 사용하는 것이 더 쉬웠지만 다음을 반환합니다 ... return doc.Declaration + doc.ToString (); 선언이 널이면 빈 문자열이됩니다.
Steve G.

이상하지만 지금은 작동하지 않습니다 ( .net fiddle )-항상 "utf-16"인코딩을 사용합니다. XDocument.Save(TextWriter)구현 내부를 살펴 보았고 구현 XDocument.Save(String)또는 XDocument.Save(Stream)구현 과 달리 선언의 인코딩을 무시합니다 . 이유가 궁금합니다 ...
Ilya Luzyanin 15.

@IlyaLuzyanin : 예, 속성 StringWriter을 재정의하는 것을 사용하지 않는 한를 전달할 때 인코딩으로 "utf-16" 을 사용 Encoding합니다. 그것에 대한 또 다른 대답이 있습니다. 나는 당신이 완전히 ... "인코딩"이 떨어지고 있었다라고 생각했다
존 소총

46

Declaration 속성에는 XML 선언이 포함됩니다. 내용과 선언을 얻으려면 다음을 수행하십시오.

tb_output.Text = xml.Declaration.ToString() + xml.ToString()

7
xdocument에서 new XDeclaration ( "1.0", "utf-8", "yes")을 사용하지 않으면 xml.Declaration이 null이기 때문에 오류가 발생합니다. 그러나 xml.save는 올바른 인코딩을 자동 감지하는 것 같습니다.
Henrik P. Hessel

또는,tb_output.Text = @"<?xml version=""1.0"" encoding=""utf-8"" ?>" + xml;
빌 호그

4
또는... = $"{xdoc.Declaration}{Environment.NewLine}{xdoc}";
WernerCD

9

이것을 사용하십시오 :

output.Text = String.Concat(xml.Declaration.ToString() , xml.ToString())

2
새 XDeclaration ( "1.0", "utf-8", "yes")을 만들고 XDocument 또는 다른 개체에 추가하지 않으면 xml.Declaration.ToString ()에서 null 예외가 발생합니다.
Ziggler 2014

1
Concat은 null 문자열을 고려하지 않기 때문에 아래와 같이 더 안전합니다. output.Text = String.Concat (xml.Declaration, xml)
dmihailescu

3

나는 이것을했다

        string distributorInfo = string.Empty;

        XDocument distributors = new XDocument();

     //below is important else distributors.Declaration.ToString() throws null exception
        distributors.Declaration = new XDeclaration("1.0", "utf-8", "yes"); 

        XElement rootElement = new XElement("Distributors");
        XElement distributor = null;
        XAttribute id = null;

        distributor = new XElement("Distributor");
        id = new XAttribute("Id", "12345678");
        distributor.Add(id);
        rootElement.Add(distributor);

        distributor = new XElement("Distributor");
        id = new XAttribute("Id", "22222222");

        distributor.Add(id);

        rootElement.Add(distributor);         

        distributors.Add(rootElement);

        distributorInfo = String.Concat(distributors.Declaration.ToString(), distributors.ToString());

배포자 정보를 보려면 아래를 참조하십시오.

<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<Distributors>
  <Distributor Id="12345678" />
  <Distributor Id="22222222" />
  <Distributor Id="11111111" />
</Distributors>

1
좋은 예입니다. 몇 가지 참고 사항 : 1) new XDeclaration ( "1.0", "utf-8", "yes") 대신 new XDeclaration ( "1.0", "utf-8") 사용, 2) 마지막 줄에 새 줄 삽입 : 배포자. Declaration.ToString () + Environment.NewLine + distributors.ToString ()
알렉세이 오 벅홉

2

다른 +1 답변과 비슷하지만 선언에 대해 조금 더 자세히 설명하고 약간 더 정확한 연결을 제공합니다.

<xml />선언은 형식이 지정된 XML의 자체 줄에 있어야하므로 새 줄이 추가되었는지 확인합니다. 참고 : 사용 Environment.Newline하면 플랫폼 특정 줄 바꿈이 생성됩니다.

// Parse xml declaration menthod
XDocument document1 =
  XDocument.Parse(@"<?xml version=""1.0"" encoding=""iso-8859-1""?><rss version=""2.0""></rss>");
string result1 =
  document1.Declaration.ToString() +
  Environment.NewLine +
  document1.ToString() ;

// Declare xml declaration method
XDocument document2 = 
  XDocument.Parse(@"<rss version=""2.0""></rss>");
document2.Declaration =
  new XDeclaration("1.0", "iso-8859-1", null);
string result2 =
  document2.Declaration.ToString() +
  Environment.NewLine +
  document2.ToString() ;

두 결과 모두 다음을 생성합니다.

<?xml version="1.0" encoding="iso-8859-1"?>
<rss version="2.0"></rss>

1

이 답변 중 몇 가지는 포스터의 요청을 해결하지만 지나치게 복잡해 보입니다. 다음은 별도의 작성기가 필요하지 않고 누락 된 선언을 처리하며 표준 ToString SaveOptions 매개 변수를 지원하는 간단한 확장 메서드입니다.

public static string ToXmlString(this XDocument xdoc, SaveOptions options = SaveOptions.None)
{
    var newLine =  (options & SaveOptions.DisableFormatting) == SaveOptions.DisableFormatting ? "" : Environment.NewLine;
    return xdoc.Declaration == null ? xdoc.ToString(options) : xdoc.Declaration + newLine + xdoc.ToString(options);
}

다만 교체, 확장을 사용 xml.ToString()하여xml.ToXmlString()



0
string uploadCode = "UploadCode";
string LabName = "LabName";
XElement root = new XElement("TestLabs");
foreach (var item in returnList)
{  
       root.Add(new XElement("TestLab",
                new XElement(uploadCode, item.UploadCode),
                new XElement(LabName, item.LabName)
                            )
               );
}

XDocument returnXML = new XDocument(new XDeclaration("1.0", "UTF-8","yes"),
             root);

string returnVal;
using (var sw = new MemoryStream())
{
       using (var strw = new StreamWriter(sw, System.Text.UTF8Encoding.UTF8))
       {
              returnXML.Save(strw);
              returnVal = System.Text.UTF8Encoding.UTF8.GetString(sw.ToArray());
       }
}

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