Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java:解析XML文件时出现问题_Java - Fatal编程技术网

Java:解析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(

我有下面的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());
我得到

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));
    }
}