programing

인쇄방법인쇄방법XDocument 사용XDocument 사용

padding 2023. 9. 20. 20:09
반응형

인쇄방법XDocument 사용

ToString 방법을 사용할 때 XDocument에서 xml 버전을 인쇄할 수 있는 방법이 있습니까?다음과 같은 것을 출력하도록 합니다.

<?xml version="1.0"?>
<!DOCTYPE ELMResponse [
]>
<Response>
<Error> ...

다음 사항이 있습니다.

var xdoc = new XDocument(new XDocumentType("Response", null, null, "\n"), ...

이것은 괜찮지만 위에 언급된 "<?xml 버전"이 누락된 인쇄 버전"이 없습니다.

<!DOCTYPE ELMResponse [
]>
<Response>
<Error> ...

제가 직접 수작업으로 출력하면 될 것으로 알고 있습니다.X Document를 이용해서 가능한지 알고 싶었을 뿐입니다.

XDeclaration을 사용합니다.그러면 선언이 추가됩니다.

근데.ToString()원하는 출력을 얻을 수 없습니다.

사용하셔야 합니다.XDocument.Save()그의 방법 중 하나로

전체 샘플:

var doc = new XDocument(
        new XDeclaration("1.0", "utf-16", "yes"), 
        new XElement("blah", "blih"));

var wr = new StringWriter();
doc.Save(wr);
Console.Write(wr.ToString());

이 방법은 단연 최고의 방법이며 관리가 가장 용이합니다.

var xdoc = new XDocument(new XElement("Root", new XElement("Child", "台北 Táiběi.")));

string mystring;

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

암호화를 변경하면 무엇이든 바꿀 수 있기 때문에 그렇게 말합니다.UTF8 to.유니코드 또는 .UTF32

오래된 질문에 대한 답변이 늦었지만, 다른 답변들보다 더 많은 세부사항을 제공하도록 노력하겠습니다.

질문하는 것을 XML 선언이라고 합니다.

일단은.XDocument이에 대한 유형 속성을 가지고 있습니다.다른 오버로드를 사용할 수 있습니다.XDocument생성자:

var xdoc = new XDocument(
  new XDeclaration("1.0", null, null), // <--- here
  new XDocumentType("Response", null, null, "\n"), ... 
  );

또는 속성을 나중에 설정합니다.

xdoc.Declaration = new XDeclaration("1.0", null, null);

하지만 당신이 어떻게 저장하느냐에 따라 당신의 글을XDocument나중에 선언(또는 그 일부)이 무시될 수 있습니다.그것에 대해서는 나중에 더.

XML 선언에는 여러 가지 모양이 있을 수 있습니다.다음은 몇 가지 유효한 예입니다.

<?xml version="1.0"?>                                        new XDeclaration("1.0", null, null)
<?xml version="1.1"?>                                        new XDeclaration("1.1", null, null)
<?xml version="1.0" encoding="us-ascii"?>                    new XDeclaration("1.0", "us-ascii", null)
<?xml version="1.0" encoding="utf-8"?>                       new XDeclaration("1.0", "utf-8", null)
<?xml version="1.0" encoding="utf-16"?>                      new XDeclaration("1.0", "utf-16", null)
<?xml version="1.0" encoding="utf-8" standalone="no"?>       new XDeclaration("1.0", "utf-8", "no")
<?xml version="1.0" encoding="utf-8" standalone="yes"?>      new XDeclaration("1.0", "utf-8", "yes")
<?xml version="1.0" standalone="yes"?>                       new XDeclaration("1.0", null, "yes")

참고:XDeclaration잘못된 주장을 기꺼이 받아들일 것이므로 이를 올바르게 이해하는 것은 당신에게 달려 있습니다.

많은 경우에 첫번째 것은<?xml version="1.0"?>, 당신이 요구하는 양식은 완벽합니다. (그것은 줄 필요가 없습니다.)encoding단지 UTF-8(ASCII 포함)이고, 지정할 필요가 없는 경우standalone그 가치가 있다면"no"또는 DTD가 없는 경우).

참고:xdoc.ToString()에서 오버라이드를 수행합니다.XNode기본 클래스(의 내 버전에서).NET) 및 XML 선언을 포함하지 않습니다.다음과 같이 이 문제를 해결할 수 있는 방법을 쉽게 만들 수 있습니다.

public static string ToStringWithDecl(this XDocument d)
  => $"{d.Declaration}{Environment.NewLine}{d}";

다른 대답들 중 일부는 다음과 같은 것을 나타냅니다.XDeclaration를 사용하면 존경받을 것입니다.xdoc.Save아니면xdoc.WriteTomethods, 그러나 그것은 사실이 아닙니다.

  • XML 선언을 포함할 수도 있습니다.XDocument
  • 그들은 당신이 준 인코딩 대신에 대상 파일, 스트림, 라이터, 스트링 빌더 등에 의해 사용되는 인코딩을 지정할 수도 있고, 당신이 그것을 당신의 파일에서 했다면 인코딩을 생략하는 대신에 지정할 수도 있습니다.XDeclaration
  • 그들은 당신의 버전을 예에서 바꿀 수도 있습니다.1.1안으로1.0

물론 파일에 저장/쓰기할 때 선언문이 해당 파일의 실제 인코딩과 일치하는 것은 좋은 일입니다!

에 쓸 때 를 수 있습니다.utf-16도)NET 문자열은 내부적으로 UTF-16에 있습니다.대신 위의 확장 방법을 사용할 수 있습니다.과 같은 할 수 :는 EricSch다.

  string xdocString;
  using (var hackedWriter = new SuppressEncodingStringWriter())
  {
    xdoc.Save(hackedWriter);
    xdocString = hackedWriter.ToString();
  }

사용자의 위치:

// a string writer which claims its encoding is null in order to omit encoding in XML declarations
class SuppressEncodingStringWriter : StringWriter
{
  public sealed override Encoding Encoding => null;
}

추가. 을 업데이트 간에StringWriter 해당 형)TextWriter) nullable 참조 유형을 사용하려면 , 및 등의 속성을 nullable로 결정했습니다.어쩌면 불행한 일이었을까요?어쨌든 nullable reference type이 켜져 있으면 다음과 같이 쓸 필요가 있을 수 있습니다.null!d이 null.

입력만 하면 됩니다.

var doc =
    new XDocument (
        new XDeclaration ("1.0", "utf-16", "no"),
        new XElement ("blah", "blih")
    );

그리고 당신은

<?xml version="1.0" encoding="utf-16" standalone="no"?>
<blah>blih</blah>

VB.NET 솔루션 코드

코드

   Dim _root As XElement = <root></root>
   Dim _element1 As XElement = <element1>i am element one</element1>
   Dim _element2 As XElement = <element2>i am element one</element2>
   _root.Add(_element1)
   _root.Add(_element2)
   Dim _document As New XDocument(New XDeclaration("1.0", "UTF-8", "yes"), _root)
   _document.Save("c:\xmlfolder\root.xml")

출력 노트(노트장에서 출력을 여십시오)

 <?xml version="1.0" encoding="utf-8" standalone="yes"?>
 <root>
   <element1>i am element one</element1>
   <element2>i am element one</element2>
</root>

더 쉬운 방법은 다음과 같습니다.

var fullXml = $"{xDocument.Declaration}{xDocument}";

xDocument.선언문이 비어 있습니다. 추가만 하면 됩니다.

언급URL : https://stackoverflow.com/questions/957124/how-to-print-xml-version-1-0-using-xdocument

반응형