2013-08-30 3 views
3

JAXP 및 Xerces2에서 로케일 특정 오류 메시지를 사용하려고합니다. 기본적으로 영어 메시지 만 사용할 수 있습니다.Xerces 2.11.0의 로케일 특정 메시지 (Java)

첫 번째 단계는 메시지 파일을 검색하여 "org/apache/xerces/impl/msg /"패키지에 넣는 것입니다. Locale.setDefault (Locale.GERMANY)을 사용하면 독일어 메시지가 표시되므로 이것이 작동합니다.

하지만 메시지를 인스턴스별로 다르게 현지화하고 싶습니다. 따라서 한 파서는 영어 메시지를 반환하고 다른 파서는 독일어 메시지를 반환해야합니다.

내가 SAX2 파서를 만드는 데 사용하고 코드는 다음과 같습니다

DOM에 대한
org.xml.sax.XMLReader ret = XMLReaderFactory.createXMLReader(); 

나는 DocumentBuilder를 사용하고이 (매우 간단) 추천했습니다 :

final DocumentBuilderFactory aDocumentBuilderFactory = DocumentBuilderFactory.newInstance(); 
    final DocumentBuilder aDocBuilder = aDocBuilderFactory.newDocumentBuilder(); 
    final Document doc = aDocumentBuilder.parse (aInputSource); 

내가 같은 것을 발견 setLocale(Locale) 메서드가있는 org.apache.xerces.impl.XMLErrorReporter 클래스를 가져 왔지만 가져 오거나 설정할 수있는 방법을 찾지 못했습니다.

SAX1로 전환하는 것은 옵션이 아닙니다.

도움을 주시면 감사하겠습니다.

답변

4

최대 이식성은 없지만 파서가 모든 경우의 99 %에서 아파치 파서이므로 작동합니다. SAXParser saxParser를 들어

final DocumentBuilderFactory aDocBuilderFactory = DocumentBuilderFactory.newInstance(); 
aDocBuilderFactory.setAttribute("http://apache.org/xml/properties/locale", Locale.FRANCE); 
final DocumentBuilder aDocBuilder = aDocBuilderFactory.newDocumentBuilder(); 
final Document doc = aDocBuilder.parse (aInputSource); 

단순히 saxParser.setProperty("http://apache.org/xml/properties/locale", Locale.FRANCE);

오 전화, 공식 소스 잊었 : http://xerces.apache.org/xerces2-j/properties.html

+0

감사합니다 - 이것은 내가 찾고 있었던 것이 었습니다! –

+0

참고 : 영어 유효성 검사 메시지를 강제로 표시하려면 빈 Locale 객체를 입력해야 할 수 있습니다. 이것은 JRE에 XMLMessage_en.properties가 포함되어 있지 않기 때문에 기본 로케일 세트 (필자의 경우 독일어 또는 프랑스어)가 포함 된 번들로 잘 해석되도록 시도하기 때문입니다. 빈 Locale를 사용하면 (자) JRE에 영어 property가 포함 된 basename를 사용해 ResourceBundle기구를 강제합니다. – beat

+0

XSD 유효성 검사를 사용할 때 유사한 문제가 발생하여 작은 메모가 발생했습니다. 'Validator' 인스턴스가 있으면'validator.setProperty ("http://apache.org/xml/properties/locale", Locale.FRANCE); - 그러나 "en"언어이지만 영어가 아닌 기본 로케일을 가진 로케일을 가지고 있다면 조심하십시오 - 영어 메시지를 시행하기 위해'Locale.ROOT'를 사용하십시오! –

0

난 당신, 당신은 매개 변수로 로케일 이름을 제공 할 수는하는 formatMessage (...) 메소드를 호출하려고 사용자 지정 유효성 검사를 작성하는 경우

com.sun.org.apache.xerces.internal.impl.msg.XMLMessageFormatter 

를 사용하려고한다고 생각합니다.

동일한 예가 아파치 라이브러리 자체에서 제공됩니다. 참조 그것을 http://cr.openjdk.java.net/~coffeys/openJDK.7u21.sync/webrev/jaxp/src/com/sun/org/apache/xerces/internal/impl/msg/XMLMessageFormatter_zh_CN.java-.html

또는

http://www.docjar.com/html/api/com/sun/org/apache/xerces/internal/impl/msg/XMLMessageFormatter.java.html

또 다른 방법은 당신이 당신의 자신의 방법으로 그것을 구현하기 위해하는 formatMessage() 메소드를 오버라이드 (override) 일 수 있었다. 이 방법의 아래에 구현 코드를 참조하십시오

public String More ...formatMessage(Locale locale, String key, Object[] arguments) 
     throws MissingResourceException { 
      if (fResourceBundle == null || locale != fLocale) { 
      if (locale != null) { 
       fResourceBundle = PropertyResourceBundle.getBundle("com.sun.org.apache.xerces.internal.impl.msg.XMLMessages", locale); 
       // memorize the most-recent locale 
       fLocale = locale; 
      } 
      if (fResourceBundle == null) 
       fResourceBundle = PropertyResourceBundle.getBundle("com.sun.org.apache.xerces.internal.impl.msg.XMLMessages"); 
     } 

이 자원 번들 파일이 로케일에 따라 선언 된 경우, 컨트롤이 다른 언어에 오류 메시지를 갖는 다른 리소스 파일을 선택 할 수 있어야 나타냅니다.

+0

을 내가 XMLMessageFormatter 사용에 대한 만에 생각했다 제공되는 예제에서는 get과 upda를 위해'XMLSchemaValidatorComponentManager'를 사용하고 있습니다. 나는 XMLMessageFormatter를 사용하지 않는다.표준 DocumentBuilder 설정으로 할 수있는 방법이 있어야합니다 .... –

+0

죄송합니다. 내 잘못 .. 잘못된 링크를 넣었습니다. 올바른 것을 업데이트하십시오. 희망이 도움이됩니다. – gyan

+0

링크를 업데이트 해 주셔서 감사합니다. 그래서 저는 로케일을 직접 설정할 수 없다고 생각합니다. 그렇다면 어떻게 XMLMessageFormatter를 설정할 수 있습니까? 어떤 속성을 사용할 수 있습니까? 이 솔루션은 Xerces에 바인딩되어 있기 때문에 최적이 아닙니다 ..... –

2

가능성 세트/MessageFormatter을 얻을 :

Validator validator = schema.newValidator();  
XMLErrorReporter property = (XMLErrorReporter) validator.getProperty("http://apache.org/xml/properties/internal/error-reporter"); 
MessageFormatter messageFormatter = property.getMessageFormatter("http://www.w3.org/TR/xml-schema-1"); 
property.putMessageFormatter(MyMessageFormatter.SCHEMA_DOMAIN, new MyMessageFormatter()); 


public class MyMessageFormatter implements MessageFormatter { 
    public static final String SCHEMA_DOMAIN = "http://www.w3.org/TR/xml-schema-1"; 
    //... 
    public String formatMessage(Locale locale, String key, Object[] arguments) 
      throws MissingResourceException {...} 
    //... 

}