注: 私はEclipseLink JAXB(MOXy)のリーダーであり、JAXB(JSR-222)エキスパートグループのメンバーです。
XSDファイルからクラスを生成してロケーターデータをサポートできる別のJavaXMLフレームワークがある場合は、切り替えてもかまいません。
JAXBはXMLスキーマからクラスを生成できます。以下は、位置情報を取得するためのいくつかの方法です。JAXBとXMLBeansの比較については、以下を参照してください。
オプション#1-StAXおよびUnmarshaller.Listener
デモ
package forum10241929;
import java.io.File;
import javax.xml.bind.*;
import javax.xml.stream.*;
import javax.xml.transform.stream.StreamSource;
public class Demo {
public static void main(String[] args) throws Exception {
JAXBContext jc = JAXBContext.newInstance(Customer.class);
XMLInputFactory xif = XMLInputFactory.newFactory();
XMLStreamReader xsr = xif.createXMLStreamReader(new StreamSource(new File("src/forum10241929/input.xml")));
Unmarshaller unmarshaller = jc.createUnmarshaller();
unmarshaller.setListener(new LocationListener(xsr));
Customer customer = (Customer) unmarshaller.unmarshal(xsr);
}
private static class LocationListener extends Unmarshaller.Listener {
private XMLStreamReader xsr;
public LocationListener(XMLStreamReader xsr) {
this.xsr = xsr;
}
@Override
public void afterUnmarshal(Object target, Object parent) {
log("End", target);
}
@Override
public void beforeUnmarshal(Object target, Object parent) {
log("Start", target);
}
private void log(String event, Object target) {
System.out.print(event);
System.out.print(" ");
System.out.print(target);
System.out.print(" [");
Location location = xsr.getLocation();
System.out.print(location.getLineNumber());
System.out.print(",");
System.out.print(location.getColumnNumber());
System.out.println("]");
}
}
}
input.xml
<?xml version="1.0" encoding="UTF-8"?>
<customer>
<name>Jane Doe</name>
<address>
<street>1 A Street</street>
</address>
</customer>
出力
Start forum10241929.Customer@144aa0ce [2,11]
Start forum10241929.Address@19e3cd51 [4,14]
End forum10241929.Address@19e3cd51 [6,15]
End forum10241929.Customer@144aa0ce [7,12]
お客様
package forum10241929;
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement
public class Customer {
private String name;
private Address address;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Address getAddress() {
return address;
}
public void setAddress(Address address) {
this.address = address;
}
}
住所
package forum10241929;
public class Address {
private String street;
public String getStreet() {
return street;
}
public void setStreet(String street) {
this.street = street;
}
}
オプション#2-@XmlLocation
EclipseLink JAXB(MOXy)と呼ばれるリファレンス実装の両方でサポートされるJAXB拡張機能があります@XmlLocation
(以下はMOXyを使用した例です)。これは開始位置のみをキャプチャします。
package forum10241929;
import javax.xml.bind.annotation.XmlRootElement;
import org.eclipse.persistence.oxm.annotations.XmlLocation;
import org.xml.sax.Locator;
@XmlRootElement
public class Customer {
private String name;
private Address address;
@XmlLocation
private Locator location;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Address getAddress() {
return address;
}
public void setAddress(Address address) {
this.address = address;
}
}