34

Javaメソッドを使用してdbから以下のxmlをフェッチしようとしていますが、エラーが発生します

xmlの解析に使用されるコード

DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder();

InputSource is = new InputSource(new ByteArrayInputStream(cond.getBytes()));

Document doc = db.parse(is);

Element elem = doc.getDocumentElement();

// here we expect a series of <data><name>N</name><value>V</value></data>
NodeList nodes = elem.getElementsByTagName("data");

TableID jobId = new TableID(_processInstanceId);
Job myJob = Job.queryByID(_clientContext, jobId, true);

if (nodes.getLength() == 0) {
    log(Level.DEBUG, "No data found on condition XML");

}

for (int i = 0; i < nodes.getLength(); i++) {
    // loop through the <data> in the XML

    Element dataTags = (Element) nodes.item(i);
    String name = getChildTagValue(dataTags, "name");
    String value = getChildTagValue(dataTags, "value");

    log(Level.INFO, "UserData/Value=" + name + "/" + value);

    myJob.setBulkUserData(name, value);
}

myJob.save();

データ

<ContactDetails>307896043</ContactDetails>
<ContactName>307896043</ContactName>
<Preferred_Completion_Date>
</Preferred_Completion_Date>
<service_address>A-End Address: 1ST HELIERST HELIERJT2 3XP832THE CABLES 1 POONHA LANEST HELIER JE JT2 3XP</service_address>
<ServiceOrderId>315473043</ServiceOrderId>
<ServiceOrderTypeId>50</ServiceOrderTypeId>
<CustDesiredDate>2013-03-20T18:12:04</CustDesiredDate>
<OrderId>307896043</OrderId>
<CreateWho>csmuser</CreateWho>
<AccountInternalId>20100333</AccountInternalId>
<ServiceInternalId>20766093</ServiceInternalId>
<ServiceInternalIdResets>0</ServiceInternalIdResets>
<Primary_Offer_Name  action='del'>MyMobile Blue &#163;44.99 [12 month term]</Primary_Offer_Name>
<Disc_Reason  action='del'>8</Disc_Reason>
<Sup_Offer  action='del'>80000257</Sup_Offer>
<Service_Type  action='del'>A-01-00</Service_Type>
<Priority  action='del'>4</Priority>
<Account_Number  action='del'>0</Account_Number>
<Offer  action='del'>80000257</Offer>
<msisdn  action='del'>447797142520</msisdn>
<imsi  action='del'>234503184</imsi>
<sim  action='del'>5535</sim>
<ocb9_ARM  action='del'>false</ocb9_ARM>
<port_in_required  action='del'>
</port_in_required>
<ocb9_mob  action='del'>none</ocb9_mob>
<ocb9_mob_BB  action='del'>
</ocb9_mob_BB>
<ocb9_LandLine  action='del'>
</ocb9_LandLine>
<ocb9_LandLine_BB  action='del'>
</ocb9_LandLine_BB>
<Contact_2>
</Contact_2>
<Acc_middle_name>
</Acc_middle_name>
<MarketCode>7</MarketCode>
<Acc_last_name>Port_OUT</Acc_last_name>
<Contact_1>
</Contact_1>
<Acc_first_name>.</Acc_first_name>
<EmaiId>
</EmaiId>

エラー

 org.apache.xerces.impl.io.MalformedByteSequenceException: Invalid byte 1 of 1-byte UTF-8 sequence.

いくつかのスレッドで読んだのは、xmlの特殊文字が原因です。この問題を修正する方法は?

4

14 に答える 14

22

この問題を解決するにはどうすればよいですか?

正しい文字エンコーディングを使用してデータを読み取ります。このエラー メッセージは、データを UTF-8 として読み取ろうとしている (故意に、または指定されていない XML ファイルの既定のエンコードであるため<?xml version="1.0" encoding="somethingelse"?>) ことを意味しますが、実際には ISO-8859-1 などの別のエンコードになっています。またはWindows-1252。

これを行う方法についてアドバイスできるようにするには、XML を読み取るために現在使用しているコードを確認する必要があります。

于 2013-03-21T11:11:35.277 に答える
21
  1. xml をメモ帳で開く
  2. ドキュメントの最初と最後に余分なスペースがないことを確認してください。
  3. [ファイル] -> [名前を付けて保存] を選択します
  4. ファイルの種類を選択 -> すべてのファイル
  5. ファイル名を abcd.xml として入力します
  6. エンコーディング - UTF-8 を選択 -> [保存] をクリックします
于 2014-11-21T08:43:18.707 に答える
7

試す:

InputStream inputStream= // Your InputStream from your database.
Reader reader = new InputStreamReader(inputStream,"UTF-8");

InputSource is = new InputSource(reader);
is.setEncoding("UTF-8");

saxParser.parse(is, handler);

UTF-8 以外の場合は、エンコーディング部分を適切なものに変更してください。

于 2013-03-21T11:09:49.443 に答える
0

Ant ビルドが原因で、たまたまこの問題に遭遇しました。

その Ant ビルドはファイルを取り、それに適用filterchain expandpropertiesしました。このファイル フィルタリング中に、Windows マシンの暗黙的なデフォルトの非 UTF-8 文字エンコーディングが使用されて、フィルタリングされたファイルが生成されました。そのため、その文字セット外の文字は正しくマップできませんでした。

1 つの解決策は、Ant に UTF-8 用の明示的な環境変数を提供することでした。Cygwin では、Ant を起動する前に: export ANT_OPTS="-Dfile.encoding=UTF-8".

于 2016-02-03T14:48:57.070 に答える
0

私は同じ問題に遭遇し、XML ファイルを長時間調査した結果、問題を発見しました« »

于 2016-02-17T23:47:42.880 に答える