Java:解析XML文件时出现问题
我有下面的XML,我正试图打印一些节点的值。例如,我想用下面的代码打印Java:解析XML文件时出现问题,java,Java,我有下面的XML,我正试图打印一些节点的值。例如,我想用下面的代码打印 NodeList list = doc.getElementsByTagName("photo"); element = (Element)list.item(0); list = element.getChildNodes(); System.out.println(list.item(0).getNodeName()); System.out.println(list.item(0).getNodeValue(
NodeList list = doc.getElementsByTagName("photo");
element = (Element)list.item(0);
list = element.getChildNodes();
System.out.println(list.item(0).getNodeName());
System.out.println(list.item(0).getNodeValue());
我得到
null
#text
而不是“标题”和“bigfish live 200812”
我做错了什么?
谢谢
大鱼活200812
中村和弘摄
0
大鱼
居住
即将到来:事件=1167424
http://www.flickr.com/photos/fishthemusic/2882550369/
因为当您调用元素.getChildNodes()
时,您将获得该元素的所有子元素,其中包括id
和secret
等属性。因此,list.item(0)
是一个属性,这就是为什么您没有得到预期的结果
getNodeName()
返回null
,因为属性没有节点名getNodeValue()
返回#text
,因为属性的值是文本节点,而文本节点又保存该属性的字符串值
此外,请不要重新定义相同的变量(例如,
列表
),以重复使用完全不同的变量。这是一种非常糟糕的做法。在photo
元素中有一个文本节点,在下面的示例中标记为XXXX。您将获得此文本节点。请注意,可能有多个相邻的文本节点。您需要找到元素类型为的第一个节点,以获取您的所有者
元素
<photo ...>XXXX
XXXX<owner nsid="64878451@N00" ... />
作为输出。有关详细信息,请参见。(它还表明,
#text
是文本节点的节点名,这正是您所得到的)。使用JAXB而不是SAX/DOM将使这项火箭科学变得更加容易。有关解释,请参阅
首先,编写等效的XSD模式(可以省略不需要的节点);这是一个良好的开端:
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:element name="photo">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="owner" type="owner" />
<xsd:element name="title" type="xsd:string" />
</xsd:sequence>
<xsd:attribute name="id" type="xsd:int" />
<xsd:attribute name="secret" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:complexType name="owner">
<xsd:attribute name="nsid" type="xsd:string" />
</xsd:complexType>
</xsd:schema>
其次,使用这个maven插件从中生成类:
然后,编写一些代码(并添加到项目中):
公共类JaxbTest{
@试验
public void应该解析配方()抛出JAXBEException{
URL xmlUrl=Resources.getResource(“file.xml”);
Photo recipe=parse(xmlUrl,Photo.class);
assertEquals(Integer.valueOf(15),recipe.getCooking().getDuration());
}
private T parse(URL,Class clazz)抛出jaxbeexception{
Unmarshaller unmarsh=JAXBContext.newInstance(clazz.createUnmarshaller();
返回clazz.cast(unmarsh.unmarshal(url));
}
}
ps.
Resources.getResource
来自番石榴;使用Thread.currentThread().getContextClassLoader().getSystemResource(“file.xml”)取而代之的是我不认为他在getChildNodes中获得属性,但他获得的是空白字符的文本节点。xml忽略空白,除非在
@Travis内部,这是不正确的。首先,属性不被认为是DOM中元素节点的子级,其次,默认情况下不会忽略空白。CDATA只是语法上的糖分,它与空格没有特殊关系。@PeterŠtibraný现在我只是打印doc.getDocumentElement().getLastChild().getNodeName(),因为我想要“URL>,但我得到的是#text…@user680406:document元素是“rsp”元素,它的最后一个子节点是
标记后的空格。
NodeList list = doc.getElementsByTagName("photo");
element = (Element)list.item(0);
list = element.getChildNodes();
int ix = 0;
while (ix < list.getLength() && list.item(ix).getNodeType() != Node.ELEMENT_NODE) {
ix++;
}
// now ix points to your first element node (if there was one)
System.out.println(list.item(ix).getNodeName());
System.out.println(list.item(ix).getNodeValue());
owner
null
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:element name="photo">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="owner" type="owner" />
<xsd:element name="title" type="xsd:string" />
</xsd:sequence>
<xsd:attribute name="id" type="xsd:int" />
<xsd:attribute name="secret" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:complexType name="owner">
<xsd:attribute name="nsid" type="xsd:string" />
</xsd:complexType>
</xsd:schema>
public class JaxbTest {
@Test
public void should_parse_recipe() throws JAXBException {
URL xmlUrl = Resources.getResource("file.xml");
Photo recipe = parse(xmlUrl, Photo.class);
assertEquals(Integer.valueOf(15), recipe.getCooking().getDuration());
}
private <T> T parse(URL url, Class<T> clazz) throws JAXBException {
Unmarshaller unmarsh = JAXBContext.newInstance(clazz).createUnmarshaller();
return clazz.cast(unmarsh.unmarshal(url));
}
}