我有一个关于XML和解析XML的问题。我使用JDOM来解析我的XML,但是我遇到了一个小问题。
我的XML文件示例如下所示:
<IO name="Bus" type="Class">
<ResourceAttribute name="Bandwidth" type="KiloBitPerSecond" value="50" />
</IO>总线是类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);
}值是定义对象属性的类:
public class Values{
private String name;
//private AttributeType datatype;
private String value;这是密码的其余部分。我有两个关于这个的问题。第一个项目目前得到了更多的优先考虑。
提前感谢,希望我能表达我的自我。
编辑:在其中添加了一个额外的for-循环,所以现在的输出是:
name:Bandwidth
type:KiloBitPerSecond
value:50这意味着name是该属性的名称,而value是name的值。我不知道。至少第一个问题现在更清楚了,我可以试着在第二个问题上工作,但是新的信息使我更加清楚。
发布于 2013-09-24 15:03:51
在xml中,element的开始标记位于<和> (或/>)之间,在<之后是元素的名称,然后是格式name="value"的attributes列表。元素可以用/>内联关闭,也可以用结束标记</[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) { ... }https://stackoverflow.com/questions/18983973
复制相似问题