我有一個具有屬性名稱和地址的Person類。我用XML顯示它。使用XML進行解組時,可以分別爲名稱和地址獲取行號。 我試過使用定位器。但它不提供個人行號。使用jaxb反編組時的單個XML元素的行號
回答
的EclipseLink JAXB (MOXy)和JAXB參考實現各自具有它們自己的註釋@XmlLocation
用於支持這種使用情況。這允許您將該對象所對應的XML元素上的位置作爲org.xml.sax.Locator
的實例存儲。由於我的莫西領先,我將演示如何使用莫西:
人
import javax.xml.bind.annotation.*;
import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
import org.eclipse.persistence.oxm.annotations.XmlLocation;
import org.xml.sax.Locator;
@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class Person {
@XmlJavaTypeAdapter(value=StringAdapter.class)
String name;
Address address;
@XmlLocation
Locator locator;
}
地址
import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
import org.eclipse.persistence.oxm.annotations.XmlLocation;
import org.xml.sax.Locator;
public class Address {
@XmlJavaTypeAdapter(value=StringAdapter.class)
private String street;
@XmlLocation
Locator locator;
}
StringAdapter
import javax.xml.bind.annotation.*;
import javax.xml.bind.annotation.adapters.XmlAdapter;
import org.eclipse.persistence.oxm.annotations.XmlLocation;
import org.xml.sax.Locator;
public class StringAdapter extends XmlAdapter<StringAdapter.AdaptedString, String> {
public static class AdaptedString {
@XmlValue
public String value;
@XmlLocation
@XmlTransient
Locator locator;
}
@Override
public String unmarshal(AdaptedString v) throws Exception {
System.out.println(v.value + " " + v.locator.getLineNumber());
return v.value;
}
@Override
public AdaptedString marshal(String v) throws Exception {
AdaptedString adaptedString = new AdaptedString();
adaptedString.value = v;
return adaptedString;
}
}
你需要個
jaxb.properties
要指定莫西爲您的JAXB提供者包括在同一個包中的以下項域模型稱爲jaxb.properties
文件。
javax.xml.bind.context.factory=org.eclipse.persistence.jaxb.JAXBContextFactory
演示
import java.io.File;
import javax.xml.bind.*;
public class Demo {
public static void main(String[] args) throws Exception {
JAXBContext jc = JAXBContext.newInstance(Person.class);
Unmarshaller unmarshaller = jc.createUnmarshaller();
File xml = new File("src/forum14455596/input.xml");
Person person = (Person) unmarshaller.unmarshal(xml);
System.out.println("Person: " + person.locator.getLineNumber());
System.out.println("Address: " + person.address.locator.getLineNumber());
}
}
輸出
Jane Doe 3
1 A Street 5
Person: 2
Address: 4
你可以充分利用的StAX StreamReaderDelegate
並做類似如下:
演示
import javax.xml.bind.*;
import javax.xml.stream.*;
import javax.xml.stream.util.StreamReaderDelegate;
import javax.xml.transform.stream.StreamSource;
public class Demo {
public static void main(String[] args) throws Exception {
JAXBContext jc = JAXBContext.newInstance(Person.class);
XMLInputFactory xif = XMLInputFactory.newFactory();
StreamSource source = new StreamSource("src/forum14455596/input.xml");
XMLStreamReader xsr = xif.createXMLStreamReader(source);
xsr = new StreamReaderDelegate(xsr) {
@Override
public String getLocalName() {
String localName = super.getLocalName();
if(isStartElement()) {
System.out.println(localName + " " + this.getLocation().getLineNumber());
}
return localName;
}
};
Unmarshaller unmarshaller = jc.createUnmarshaller();
unmarshaller.unmarshal(xsr);
}
}
人
import javax.xml.bind.annotation.*;
@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class Person {
private String name;
private String address;
}
的input.xml
<?xml version="1.0" encoding="UTF-8"?>
<person>
<name>Jane Doe</name>
<address>1 A Street</address>
</person>
輸出
person 2
name 3
address 4
我如何能夠達到同樣的嵌套XML文件的情況。是否有可能在個人課堂內擁有像Locator這樣的財產。 –
@AnandB - 無論XML的深度如何,該代碼都會輸出每個啓動元素的行號。 –
在單獨的課程中是否可以擁有像Locator這樣的屬性? –
- 1. 使用JAXB解組XML元素的單個元素
- 2. JAXB從XML檢索單個元素
- 3. JAXB反編組
- 4. 具有兩個屬性和簡單元素的XML元素使用JAXB
- 5. JAXB將多個XML元素解組爲單個類
- 6. 使用JAXB的XML解組編碼
- 7. 使用JAXB解組XML XML編碼
- 8. JAXB添加的xmlns到元素使用JAXB編組的Java對象時編組的Java
- 9. JAXB編組:篩選葉元素的值
- 10. JAXB:元帥/解組不同的XML元素/從一個類
- 11. 使用JAXB編組時消除空元素
- 12. JAXB:使xml元素的名稱透明
- 13. 反編組xml與多個表示相同的元素
- 14. 如何使用JAXB編組帶有XML根元素的java列表?
- 15. JAXB將XML元素解組爲HashMap
- 16. JAXB編組:使用屬性創建一個空元素
- 17. 編碼XML元素中的雙引號使用LINQ to XML
- 18. 使用JAXB和多個相同的子元素構建XML
- 19. 如何反序列化元素名稱列表編號的XML?
- 20. JAXB 2.x:編組將元素值放入XML中兩次
- 21. Jaxb XML編組添加前綴到根元素
- 22. WebSphereApplication NoClassDefFoundError使用JAXB解組XML時的編碼
- 23. jaxb - 編組完整的java包編組根元素
- 24. JAXB標註 - 從xml元素
- 25. jaxb編組跳過空元素
- 26. XML的一部分可以使用JAXB(或JAXB + StAX)進行編組嗎?
- 27. Java JAXB反編組枚舉
- 28. JAXB - 反編組態對象
- 29. 使用JAXB從xml中的列表中讀取k元素使用JAXB
- 30. 如何使用JAXB對鏈接的Java對象進行編組/解組編號
在上面的例子中,是否有可能獲得XML文件中字符串值的Street的行號 –
@AnandB - 您想在哪裏存儲「Street」的行號?同樣出於好奇,你爲什麼要存儲所有的行號? –
@AnandB - 我已經用可能有效的'XmlAdapter'方法更新了我的答案。最終你可能不想使用'String'屬性,直接在你的模型中使用像'AdaptedString'這樣的類。 –