मैं एक XML दस्तावेज़ पर हस्ताक्षर कर रहा हूँ जिसमें एक जावा वर्ग में विशेष वर्ण (गैर-ASCII वर्ण, जैसे , á, , ç, आदि) शामिल हैं, जिसे PeopleSoft सिस्टम द्वारा बुलाया जाता है। किसी भी समस्या से बचने के लिए, मैं इन पात्रों को हटा देता हूं, लेकिन वास्तव में मुझे उनके साथ इस हस्ताक्षरित दस्तावेज़ को प्रिंट करने की आवश्यकता है। क्या इसे करने का कोई तरीका है? यह हस्ताक्षर किए जाने वाले XML दस्तावेज़ का एक नमूना है (यह हस्ताक्षर के लिए तैयार है):

<PedidoEnvioLoteRPS xmlns="http://www.prefeitura.sp.gov.br/nfe" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <Cabecalho Versao="1" xmlns="">
    <CPFCNPJRemetente>
      <CNPJ>99999999999999</CNPJ>
    </CPFCNPJRemetente>
    <transacao>false</transacao>
    <dtInicio>2018-10-02</dtInicio>
    <dtFim>2018-10-02</dtFim>
    <QtdRPS>1</QtdRPS>
    <ValorTotalServicos>40</ValorTotalServicos>
    <ValorTotalDeducoes>0</ValorTotalDeducoes>
  </Cabecalho>
  <RPS xmlns="">
    <Assinatura>FavH23VVIbPWzlvJ28OZZ26Lv2aEgWfmsdhPN1qQN19UCxv6xzu8fHC50wnji3i3G49DuYoXy354U2IxzooPtZYWv7KFUwWLWC4xJYpNKNLOg3txx4znxDNbdC9l/ot9liIMKHf/8rJdciGMpwUOMxt3z95sFVJDcvx/3si1yQG0TaQsWLLLKHH4rUwfE+OWYBIwp/CWBf1/IRzYsFb/q2UgpvfvU1RaXIgI+aNqwYyKulhfUZItI4nYJTsGcXG0y+iXxW3oRWiCGJ5leOysHyJ4VLJcg/vehwT8f8ZQLhvClKeDQUQpL9ts+9oX4PHdc8WXDgN5ekUmvCHS/GW0ew==</Assinatura>
    <ChaveRPS>
      <InscricaoPrestador>99999999</InscricaoPrestador>
      <SerieRPS>1</SerieRPS>
      <NumeroRPS>180</NumeroRPS>
    </ChaveRPS>
    <TipoRPS>RPS</TipoRPS>
    <DataEmissao>2018-10-02</DataEmissao>
    <StatusRPS>N</StatusRPS>
    <TributacaoRPS>T</TributacaoRPS>
    <ValorServicos>40</ValorServicos>
    <ValorDeducoes>0</ValorDeducoes>
    <CodigoServico>3205</CodigoServico>
    <AliquotaServicos>2</AliquotaServicos>
    <ISSRetido>false</ISSRetido>
    <CPFCNPJTomador>
      <CNPJ>88888888888888</CNPJ>
    </CPFCNPJTomador>
    <RazaoSocialTomador>XPTO S.A.</RazaoSocialTomador>
    <EnderecoTomador>
      <Logradouro>Av do Lago</Logradouro>
      <NumeroEndereco>999</NumeroEndereco>
      <ComplementoEndereco>9 andar - cj. 99</ComplementoEndereco>
      <Bairro>Vila Guilherme</Bairro>
      <Cidade>3505708</Cidade>
      <UF>SP</UF>
      <CEP>99999999</CEP>
    </EnderecoTomador>
    <EmailTomador>teste@teste.com.br</EmailTomador>
    <Discriminacao>Tarifa de antecipação de entrega VR Saúde Familiar: R$ 40,00||||||||||||||||IRRF 1,5% Sob Responsabilidade de VR Benefícios Serv  Proc Ltda conforme I.N. 153/87 e |Lei 7450/85, art. 53 - R$ 0,60|Trib aprox. Lei nº 12.741/12: R$5,38 Federal, R$1,68 Municipal e R$32,94 pelos serviços|Fonte:IBPT/empresometro.com.br  A3S28F 18.2.B|Contrato XPTO|Autorização de Regime especial - SEI 6017.2018/0055420-5 (32600,94)|REALIZE O PAGAMENTO APENAS DE BOLETOS EMITIDOS POR VOCÊ NA ÁREA LOGADA E SEGURA DO SEU|PORTAL RH. PREVINA-SE E EVITE PREJUÍZOS FINANCEIROS.</Discriminacao>
    <ValorCargaTributaria>7.06</ValorCargaTributaria>
    <PercentualCargaTributaria>17.64</PercentualCargaTributaria>
    <FonteCargaTributaria>IBPT</FonteCargaTributaria>
  </RPS>

</PedidoEnvioLoteRPS>

हस्ताक्षर करने के लिए मैं जिस जावा विधि का उपयोग करता हूं वह है:

public void AssinaXML(String ArqAssinar) {

    try {
        /* Creates the DOM document DOM from the file in ArqAssinar */
        DocumentBuilderFactory DocBuilderFactory = DocumentBuilderFactory.newInstance();
        DocBuilderFactory.setNamespaceAware(true);
        DocumentBuilder DocBuilder = DocBuilderFactory.newDocumentBuilder();
        FileInputStream Input = new FileInputStream(ArqAssinar);
        Document Doc = DocBuilder.parse(Input);

        /* Gets the position of the Signature tag */
        Node Tag = Doc.getDocumentElement();

        if (Tag != null) {
            /* Signs the document */
            DOMSignContext DocSignCont = new DOMSignContext(PrivPass, Tag);
            XMLSignature Signature = XmlSignFac.newXMLSignature(SignInfo, KeyInf);
            Signature.sign(DocSignCont);

            /* Creates the Signature tag with the results */
            OutputStream Saida = new FileOutputStream(ArqAssinar);
            TransformerFactory TransformFac = TransformerFactory.newInstance();
            Transformer Transf = TransformFac.newTransformer();
            Transf.transform(new DOMSource(Doc), new StreamResult(Saida));  
        }
        else {
            System.out.println("Java Assinatura_Digital, método AssinaXML - A tag especificada para inserir a assinatura não foi encontrada");
        }
    }
    catch (Exception E) {
        E.PrintStackTrace();
    }
}

लेकिन जब मैं ऊपर दिए गए XML दस्तावेज़ पर हस्ताक्षर करने का प्रयास करता हूं तो मुझे यह त्रुटि होती है:

com.sun.org.apache.xerces.internal.impl.io.MalformedByteSequenceException: 3-बाइट UTF-8 अनुक्रम का अमान्य बाइट 2। कॉम पर .sun.org.apache.xerces.internal.impl.XMLEntityScanner.load (अज्ञात स्रोत) com.sun.org.apache.xerces.internal.impl.XMLEntityScanner.skipChar (अज्ञात स्रोत) पर com.sun.org.apache पर .xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next (अज्ञात स्रोत) com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next (अज्ञात स्रोत) पर com.sun.org.apache.xerces.internal पर .impl.XMLNSDocumentScannerImpl.next (अज्ञात स्रोत) com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument (अज्ञात स्रोत) पर com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse पर (अज्ञात स्रोत) com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse (अज्ञात स्रोत) पर com.sun.org.apache.xerces.internal.par पर sers.XMLParser.parse (अज्ञात स्रोत) com.sun.org.apache.xerces.internal.parsers.DOMParser.parse (अज्ञात स्रोत) पर com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderImpl.parse( अज्ञात स्रोत) javax.xml.parsers.DocumentBuilder.parse(अज्ञात स्रोत) पर GVR_Assinatura_Digital.AssinaXML(GVR_Assinatura_Digital.java:551) पर GVR_Assinatura_Digital.main(GVR_Assinatura_Digital.java:778) पर

क्या किसी को पता है कि ये क्यों हो रहा है?

0
Roberto 2 अक्टूबर 2018, 19:37

2 जवाब

सबसे बढ़िया उत्तर

जैसा कि टिप्पणीकारों ने कहा है, आप किसी भी वैध XML दस्तावेज़ पर हस्ताक्षर कर सकते हैं।

तो असली सवाल यह होना चाहिए, मैं एक वैध XML दस्तावेज़ कैसे बनाऊं जिसमें ã जैसे वर्ण शामिल हों?

उत्तर:

  • डिफ़ॉल्ट रूप से, XML दस्तावेज़ UTF-8 में एन्कोड किए जाते हैं
  • तो आप यूनिकोड वर्ण अनुक्रम के UTF-8 एन्कोडिंग के माध्यम से किसी भी वर्ण को सीधे XML दस्तावेज़ में जोड़ सकते हैं। निम्नलिखित एक वैध XML दस्तावेज़ है:

UTF-8 एन्कोडिंग

<test>Ã¥</test>
  • आप पात्रों को चरित्र संस्थाओं के रूप में भी शामिल कर सकते हैं। लेकिन एक बार जब आप अपने पात्रों को यूटीएफ -8 के रूप में प्राप्त कर लेते हैं तो उन्हें चरित्र इकाइयों में बदलने की कोई आवश्यकता नहीं होती है।

यदि आपको गैर-ASCII वर्णों वाला एक मान्य XML दस्तावेज़ बनाने में समस्या हो रही है, तो कृपया एक नया स्टैक ओवरफ़्लो प्रश्न बनाएं जिसमें कोड स्निपेट शामिल हो जो XML फ़ाइल बना रहा हो (या होना चाहिए)।

और देखें:

XML में एन्कोडिंग वर्णों पर Microsoft लेख

1
Larry K 3 अक्टूबर 2018, 07:22

मुझे समाधान मिला: मैंने अभी इसका कारोबार किया है:

FileInputStream Input = new FileInputStream(ArqAssinar);
Document Doc = DocBuilder.parse(Input);

इसके लिए:

InputStream Input = new FileInputStream(ArqAssinar);
Reader Leitor = new InputStreamReader(Input, "UTF-8");
InputSource Origem = new InputSource(Leitor);
Document Doc = DocBuilder.parse(Origem);
0
Roberto 4 अक्टूबर 2018, 13:49