我怎样才能只打印一个 object 而不是 children?
How can I just print a single object and not it's children?
我的目标是允许用户修改 object 中其他 object 列表中的元素。首先,我需要搜索元素“名称”,以便我可以识别具有需要修改的名称的特定 object。我的代码在一定程度上完成了工作,但是,我有 3 个 object,其中 2 个 object 被“嵌套”在一个中。所以我陷入困境,如果我搜索 parent object,它会显示 parent object 的结果,它是 child objects,如果我搜索 child object,它 returns 为空。我该如何解决这个问题,使其仅 returns 具有我搜索的元素名称的特定 object?我想单独对待他们每个人。
- 无法为此更改 xml 的格式,因为结构是我的限制
I'm not sure if the problem came about with how I originally parsed the xml file into java objects
主要class
public class Main {
public static void main(String[] args) throws IOException, JAXBException {
File file = new File("items.xml");
Scanner scan = new Scanner(System.in);
JAXBContext context = JAXBContext.newInstance(Items.class);
Unmarshaller un = context.createUnmarshaller();
Items itemData = (Items) un.unmarshal(file);
List<Item> items = itemData.getItem();
System.out.println("'\n\n------------- Options ---------------");
System.out.println("\n1. Search Items by Group");
System.out.println("\n2. Modify Movie");
int choice = scan.nextInt();
scan.nextLine();
if (choice == 2){
System.out.println("\nEnter the name of the movie you would like to modify: ");
String search = scan.nextLine();
Optional<Item> item = items.stream()
.filter(x -> x.getName().equals(search))
.findFirst();
System.out.println(item.toString());
}
else{
System.out.println("You entered an invalid option!");
}
}
}
项目class
public class Item {
private String dataType;
private String name;
private int data;
private String group;
private Items items;
@XmlElement
public String getDataType(){
return dataType;
}
public void setDataType(String dataType){
this.dataType = dataType;
}
@XmlElement
public String getName(){
return name;
}
public void setName(String name){
this.name = name;
}
@XmlElement
public int getData(){
return data;
}
public void setData(int data){
this.data = data;
}
@XmlElement
public String getGroup(){
return group;
}
public void setGroup(String group){
this.group = group;
}
public Items getItems() {
return items;
}
public void setItems(Items items) {
this.items = items;
}
@Override
public String toString() {
return
"\n\tDataType: " + dataType +
"\n\tName: " + name +
"\n\tData: " + data +
"\n\tGroup: " + group +
"\n\tItems: " + items + "\n";
}
}
项目class
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import java.util.List;
@XmlRootElement(name = "items")
public class Items {
private List<Item> item;
@XmlElement(name = "item")
public List<Item> getItem(){
return item;
}
public void setItem(List<Item> itemList){
this.item = itemList;
}
@Override
public String toString() {
return "\n" + item ;
}
}
XML 文件
<items>
<item>
<dataType>Number</dataType>
<name>Rush Hour</name>
<data>1</data>
<group>Comedy</group>
</item>
<item>
<dataType>Number</dataType>
<name>Harry Potter</name>
<data>2</data>
<group>Fiction</group>
<items>
<item>
<dataType>Number</dataType>
<name>Harry Potter and the Goblet Of Fire</name>
<data>3</data>
<group>Fiction</group>
</item>
<item>
<dataType>Number</dataType>
<name>Harry Potter and the Chamber of secrets</name>
<data>4</data>
<group>Fiction</group>
</item>
</items>
</item>
<item>
<dataType>Number</dataType>
<name>Men In Black</name>
<data>5</data>
<group>Action</group>
</item>
<item>
<dataType>Number</dataType>
<name>Coming to America</name>
<data>6</data>
<group>Comedy</group>
</item>
</items>
您也可以修改代码以搜索嵌套项。请从以下代码中获取帮助:
Optional<Item> item = items.stream()
.map(x->{
if(x.getItems()==null){
return Collections.singletonList(x);
}
x.getItems().getItem().add(x);
return x.getItems().getItem();
})
.flatMap(Collection::stream)
.filter(x -> x.getName().equals(search))
.peek(x-> x.setItems(null))//Peek exists mainly to support debugging
.findFirst();
这将有助于搜索 2 层嵌套 对象中的元素。
当您搜索 哈利波特与密室 时,它会给出一个映射该名称的 哈利波特 对象。
Optional[
DataType: Number
Name: Harry Potter and the Chamber of secrets
Data: 4
Group: Fiction
Items: null
]
我的目标是允许用户修改 object 中其他 object 列表中的元素。首先,我需要搜索元素“名称”,以便我可以识别具有需要修改的名称的特定 object。我的代码在一定程度上完成了工作,但是,我有 3 个 object,其中 2 个 object 被“嵌套”在一个中。所以我陷入困境,如果我搜索 parent object,它会显示 parent object 的结果,它是 child objects,如果我搜索 child object,它 returns 为空。我该如何解决这个问题,使其仅 returns 具有我搜索的元素名称的特定 object?我想单独对待他们每个人。
- 无法为此更改 xml 的格式,因为结构是我的限制
I'm not sure if the problem came about with how I originally parsed the xml file into java objects
主要class
public class Main {
public static void main(String[] args) throws IOException, JAXBException {
File file = new File("items.xml");
Scanner scan = new Scanner(System.in);
JAXBContext context = JAXBContext.newInstance(Items.class);
Unmarshaller un = context.createUnmarshaller();
Items itemData = (Items) un.unmarshal(file);
List<Item> items = itemData.getItem();
System.out.println("'\n\n------------- Options ---------------");
System.out.println("\n1. Search Items by Group");
System.out.println("\n2. Modify Movie");
int choice = scan.nextInt();
scan.nextLine();
if (choice == 2){
System.out.println("\nEnter the name of the movie you would like to modify: ");
String search = scan.nextLine();
Optional<Item> item = items.stream()
.filter(x -> x.getName().equals(search))
.findFirst();
System.out.println(item.toString());
}
else{
System.out.println("You entered an invalid option!");
}
}
}
项目class
public class Item {
private String dataType;
private String name;
private int data;
private String group;
private Items items;
@XmlElement
public String getDataType(){
return dataType;
}
public void setDataType(String dataType){
this.dataType = dataType;
}
@XmlElement
public String getName(){
return name;
}
public void setName(String name){
this.name = name;
}
@XmlElement
public int getData(){
return data;
}
public void setData(int data){
this.data = data;
}
@XmlElement
public String getGroup(){
return group;
}
public void setGroup(String group){
this.group = group;
}
public Items getItems() {
return items;
}
public void setItems(Items items) {
this.items = items;
}
@Override
public String toString() {
return
"\n\tDataType: " + dataType +
"\n\tName: " + name +
"\n\tData: " + data +
"\n\tGroup: " + group +
"\n\tItems: " + items + "\n";
}
}
项目class
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import java.util.List;
@XmlRootElement(name = "items")
public class Items {
private List<Item> item;
@XmlElement(name = "item")
public List<Item> getItem(){
return item;
}
public void setItem(List<Item> itemList){
this.item = itemList;
}
@Override
public String toString() {
return "\n" + item ;
}
}
XML 文件
<items>
<item>
<dataType>Number</dataType>
<name>Rush Hour</name>
<data>1</data>
<group>Comedy</group>
</item>
<item>
<dataType>Number</dataType>
<name>Harry Potter</name>
<data>2</data>
<group>Fiction</group>
<items>
<item>
<dataType>Number</dataType>
<name>Harry Potter and the Goblet Of Fire</name>
<data>3</data>
<group>Fiction</group>
</item>
<item>
<dataType>Number</dataType>
<name>Harry Potter and the Chamber of secrets</name>
<data>4</data>
<group>Fiction</group>
</item>
</items>
</item>
<item>
<dataType>Number</dataType>
<name>Men In Black</name>
<data>5</data>
<group>Action</group>
</item>
<item>
<dataType>Number</dataType>
<name>Coming to America</name>
<data>6</data>
<group>Comedy</group>
</item>
</items>
您也可以修改代码以搜索嵌套项。请从以下代码中获取帮助:
Optional<Item> item = items.stream()
.map(x->{
if(x.getItems()==null){
return Collections.singletonList(x);
}
x.getItems().getItem().add(x);
return x.getItems().getItem();
})
.flatMap(Collection::stream)
.filter(x -> x.getName().equals(search))
.peek(x-> x.setItems(null))//Peek exists mainly to support debugging
.findFirst();
这将有助于搜索 2 层嵌套 对象中的元素。
当您搜索 哈利波特与密室 时,它会给出一个映射该名称的 哈利波特 对象。
Optional[
DataType: Number
Name: Harry Potter and the Chamber of secrets
Data: 4
Group: Fiction
Items: null
]