gpt4 book ai didi

Java:通过解析 XML 文件获取对象的属性

转载 作者:行者123 更新时间:2023-11-30 11:28:10 25 4
gpt4 key购买 nike

我有一个关于 XML 及其解析的问题。我使用 JDOM 来解析我的 XML 文件,但我遇到了一个小问题。

我的 XML 文件示例如下所示:

 <IO name="Bus" type="Class">
<ResourceAttribute name="Bandwidth" type="KiloBitPerSecond" value="50" />
</IO>

Bus 是 IO 类的对象实例。该对象获得了名称和类型属性。此外,它还有一些属性,如示例中的属性带宽,值为 50 和数据类型 KiloBitPerSecond。

所以当我想遍历文件时:

    for(Element packages : listPackages)
{
Map<String, Values> valueMap = new HashMap<String, Values>();
List<Element> objectInstanceList = packages.getChildren();

for(Element objects : objectInstanceList)
{
List<Element> listObjectClasses = objects.getChildren();

for(Element classes : listObjectClasses)
{
List<Element> listObjectAttributes = classes.getChildren();

for(Element objectAttributes : listObjectAttributes)
{
List<Attribute> listAttributes = objectAttributes.getAttributes();

for(Attribute attributes : listAttributes)
{

String name = attributes.getName();
String value = attributes.getValue();
AttributeType datatype = attributes.getAttributeType();
Values v = new Values(name, datatype, value);
valueMap.put(classes.getName(), v);
System.out.println(name + ":" + value);
}

}
}
}
//System.out.println(valueMap);
}

values 是定义对象属性的类:

public class Values{
private String name;
//private AttributeType datatype;
private String value;

这就是代码的其余部分。我有两个与此相关的问题。目前第一个优先级更高。

  1. 如何获取对象 (Attribute.Name = Bandwidth; Attribute.Value = 50) 的值?相反,我得到了

    名称:公交车 类型:类

    我考虑过一个额外的 for 循环,但 JDOM 类属性没有名为 getAttributes() 的方法。

  2. 那只是次要问题,因为没有问题 1,我就不能再进一步了。正如您在示例中看到的,一个属性有 3 个属性,名称、类型和值。我怎样才能提取样本的三重放。 JDOM 似乎只知道属性、名称和值的 2 个属性。

非常感谢,希望我能表达自己的想法。

编辑:在其中添加了一个额外的 for 循环,所以现在的输出是:

name:Bandwidth
type:KiloBitPerSecond
value:50

这意味着 name 是该属性的名称,value 是 name 的值。不知道。至少问题 1 现在更清楚了,我可以尝试处理 2,但新信息让我更清楚了 2。

最佳答案

xml中element的开始标签s 被封装在 < 之间和 > (或 /> ),在 < 之后是元素的名称,然后是 attributes 的列表格式为 name="value" .可以使用 /> 内联关闭元素或带有结束标记 </[element name]>

最好使用递归来解析您的 xml,而不是可读性差/难以维护的嵌套 for 循环。

这是它的样子:

@Test
public void parseXmlRec() throws JDOMException, IOException {
String xml = "<root>"
+ "<Package>"
+ "<IO name=\"Bus\" type=\"Class\">\r\n" +
" <ResourceAttribute name=\"Bandwidth\" type=\"KiloBitPerSecond\" value=\"50\" />\r\n" +
" </IO>"
+ "</Package>"
+ "</root>";
InputStream is = new ByteArrayInputStream(xml.getBytes());
SAXBuilder sb = new SAXBuilder();
Document document = sb.build(is);
is.close();

Element root = document.getRootElement();
List<Element> children = root.getChildren();
for(Element element : children) {
parseelement(element);
}
}

private void parseelement(Element element) {
System.out.println("Element:" + element.getName());
String name = element.getAttributeValue("name");
if(name != null) {
System.out.println("name: " + name);
}
String type = element.getAttributeValue("type");
if(type != null) {
System.out.println("type: " + type);
}
String value = element.getAttributeValue("value");
if(value != null) {
System.out.println("value: " + value);
}
List<Element> children = element.getChildren();
if(children != null) {
for(Element child : children) {
parseelement(child);
}
}
}

这个输出:

Element: Package
Element: IO
name: Bus
type: Class
Element: ResourceAttribute
name: Bandwidth
type: KiloBitPerSecond
value: 50

解析时,检查每个元素的名称并实例化对应的对象。为此,我建议编写一个单独的方法来处理每个元素。例如:

void parsePackage(Element packageElement) { ... }
parseIO(Element ioElement) { ... }
void parseResourceAttribute(Element resourceAttributeElement) { ... }

关于Java:通过解析 XML 文件获取对象的属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18983973/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com