[java] 이진 데이터를 XML에 어떻게 포함합니까?

네트워크를 통해 XML 메시지를 사용하여 서로 통신하는 Java로 작성된 두 개의 응용 프로그램이 있습니다. 수신 측에서 SAX 파서를 사용하여 메시지에서 데이터를 다시 가져옵니다. 요구 사항 중 하나는 XML 메시지에 이진 데이터를 포함하는 것이지만 SAX는 이것을 좋아하지 않습니다. 누구든지 이것을하는 방법을 알고 있습니까?

업데이트 : 다른 사람이 비슷한 것을 시도하는 경우 아파치 커먼즈 코덱 라이브러리Base64 클래스 와 함께 작동 합니다.



답변

base64를 사용하여 바이너리 데이터를 인코딩하고 Base64 요소에 넣을 수 있습니다. 아래 기사는 주제에 대해 꽤 좋은 기사입니다.

XML 문서에서 이진 데이터 처리


답변

XML은 매우 다양합니다 …

<DATA>
  <BINARY>
    <BIT index="0">0</BIT>
    <BIT index="1">0</BIT>
    <BIT index="2">1</BIT>
    ...
    <BIT index="n">1</BIT>
  </BINARY>
</DATA>

XML은 폭력과 같습니다. 문제가 해결되지 않으면 충분히 사용하지 않는 것입니다.

편집하다:

BTW : Base64 + CDATA가 아마도 최고의 솔루션 일 것입니다.

(EDIT2 :
누가 나를 upmods, 진짜 대답도 upmod하십시오. 우리는 가난한 영혼이 여기에 와서 실제로 내 방법을 구현하는 것을 원하지 않습니다.


답변

Base64가 실제로 정답이지만 CDATA는 그렇지 않습니다. 기본적으로 “이것은 무엇이든 될 수 있습니다”라고 말하지만, 그저 아무것도 아니 어야 하며 Base64로 인코딩 된 바이너리 데이터 여야합니다. XML 스키마는 Base 64 바이너리를 xsd에서 사용할 수 있는 기본 데이터 유형으로 정의합니다 .


답변

지난주에이 문제가 발생했습니다. 나는 PDF 파일을 직렬화하여 XML 파일 안에 서버로 보내야했다.

.NET을 사용하는 경우 바이너리 파일을 base64 문자열로 직접 변환하여 XML 요소 안에 붙일 수 있습니다.

string base64 = Convert.ToBase64String(File.ReadAllBytes(fileName));

또는 XmlWriter 개체에 직접 빌드 된 메서드가 있습니다. 필자의 경우에는 Microsoft의 데이터 유형 네임 스페이스를 포함해야했습니다.

StringBuilder sb = new StringBuilder();
System.Xml.XmlWriter xw = XmlWriter.Create(sb);
xw.WriteStartElement("doc");
xw.WriteStartElement("serialized_binary");
xw.WriteAttributeString("types", "dt", "urn:schemas-microsoft-com:datatypes", "bin.base64");
byte[] b = File.ReadAllBytes(fileName);
xw.WriteBase64(b, 0, b.Length);
xw.WriteEndElement();
xw.WriteEndElement();
string abc = sb.ToString();

문자열 abc는 다음과 같이 보입니다.

<?xml version="1.0" encoding="utf-16"?>
<doc>
    <serialized_binary types:dt="bin.base64" xmlns:types="urn:schemas-microsoft-com:datatypes">
        JVBERi0xLjMKJaqrrK0KNCAwIG9iago8PCAvVHlwZSAvSW5mbw...(plus lots more)
    </serialized_binary>
</doc>


답변

저는 보통 MIME Base64 또는 URL 인코딩으로 바이너리 데이터를 인코딩 합니다.


답변

바이너리 데이터를 Base64 인코딩 / 디코딩 해보세요. CDATA 섹션도 살펴보십시오.


답변

알려진 세트로 인코딩 할 수 있습니다. base 64와 같은 것이 인기있는 선택입니다.