首頁>Program>source

我無法使用 Node.getNodeValue()获取文字值 , Node.getFirstChild().getNodeValue() 或与 Node.getTextContent()

我的XML就像

<add job="351">
    <tag>foobar</tag>
    <tag>foobar2</tag>
</add>

我正在尝試获取tag值(非文字元素提取工作正常).我的Java代碼听起来像

Document doc = db.parse(new File(args[0]));
Node n = doc.getFirstChild();
NodeList nl = n.getChildNodes();   
Node an,an2;
for (int i=0; i < nl.getLength(); i++) {
    an = nl.item(i);
    if(an.getNodeType()==Node.ELEMENT_NODE) {
        NodeList nl2 = an.getChildNodes();
        for(int i2=0; i2<nl2.getLength(); i2++) {
            an2 = nl2.item(i2);
            // DEBUG PRINTS
            System.out.println(an2.getNodeName() + ": type (" + an2.getNodeType() + "):");
            if(an2.hasChildNodes())
                System.out.println(an2.getFirstChild().getTextContent());
            if(an2.hasChildNodes())
                System.out.println(an2.getFirstChild().getNodeValue());
            System.out.println(an2.getTextContent());
            System.out.println(an2.getNodeValue());
        }
    }
}

它print出来

tag type (1): 
tag1
tag1
tag1
null
#text type (3):
_blank line_
_blank line_
...

感谢您的帮助。

最新回復
  • 5月前
    1 #

    我会print出 an2.getNodeName()的結果 以及用於除錯目的.我的猜測是,您的樹爬網代碼未爬網到您认為是的节點.缺乏檢查代碼中节點名稱的能力进一步增強了這種怀疑。

    除此之外,Node的javadoc定義" getNodeValue()"以為Element型別的Node返迴null.因此,您確實應该使用getTextContent().我不確定為什麼為什麼不给您想要的文字。

    也许迭代標簽节點的子节點,看看那裏有什麼型別?

    尝試過此代碼,它對我有用:

    String xml = "<add job=\"351\">\n" +
                 "    <tag>foobar</tag>\n" +
                 "    <tag>foobar2</tag>\n" +
                 "</add>";
    DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
    DocumentBuilder db = dbf.newDocumentBuilder();
    ByteArrayInputStream bis = new ByteArrayInputStream(xml.getBytes());
    Document doc = db.parse(bis);
    Node n = doc.getFirstChild();
    NodeList nl = n.getChildNodes();
    Node an,an2;
    for (int i=0; i < nl.getLength(); i++) {
        an = nl.item(i);
        if(an.getNodeType()==Node.ELEMENT_NODE) {
            NodeList nl2 = an.getChildNodes();
            for(int i2=0; i2<nl2.getLength(); i2++) {
                an2 = nl2.item(i2);
                // DEBUG PRINTS
                System.out.println(an2.getNodeName() + ": type (" + an2.getNodeType() + "):");
                if(an2.hasChildNodes()) System.out.println(an2.getFirstChild().getTextContent());
                if(an2.hasChildNodes()) System.out.println(an2.getFirstChild().getNodeValue());
                System.out.println(an2.getTextContent());
                System.out.println(an2.getNodeValue());
            }
        }
    }
    

    輸出為:

    #text: type (3): foobar foobar
    #text: type (3): foobar2 foobar2
    

  • 5月前
    2 #

    如果您的XML非常深入,您可能要考虑使用JRE隨附的XPath,因此您可以使用以下命令更轻松地訪問內容:

    String text = xp.evaluate("//add[@job='351']/tag[position()=1]/text()", 
        document.getDocumentElement());
    

    完整示例:

    import static org.junit.Assert.assertEquals;
    import java.io.StringReader;    
    import javax.xml.parsers.DocumentBuilder;
    import javax.xml.parsers.DocumentBuilderFactory;
    import javax.xml.xpath.XPath;
    import javax.xml.xpath.XPathFactory;    
    import org.junit.Before;
    import org.junit.Test;
    import org.w3c.dom.Document;
    import org.xml.sax.InputSource;
    public class XPathTest {
        private Document document;
        @Before
        public void setup() throws Exception {
            String xml = "<add job=\"351\"><tag>foobar</tag><tag>foobar2</tag></add>";
            DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
            DocumentBuilder db = dbf.newDocumentBuilder();
            document = db.parse(new InputSource(new StringReader(xml)));
        }
        @Test
        public void testXPath() throws Exception {
            XPathFactory xpf = XPathFactory.newInstance();
            XPath xp = xpf.newXPath();
            String text = xp.evaluate("//add[@job='351']/tag[position()=1]/text()",
                    document.getDocumentElement());
            assertEquals("foobar", text);
        }
    }
    

  • 5月前
    3 #

    我使用了非常老的Java. Jdk 1.4.08和我有同樣的問题.維兹威兹 對我来說,這堂Class没有 Node 方法.我不得不用 getTextContent() 代替 Node.getFirstChild().getNodeValue() 获得节點的值.這對我来說是固定的.

  • 5月前
    4 #

    如果您對在效能和記憶體效率方面都非常出色的vtd-xml持開放態度,則下面的代碼可以完成您在XPath和手動匯航中尋找的工作... 总體代碼簡潔明了,易於理解...

    Node.getNodeValue()
    
    import com.ximpleware.*; public class queryText { public static void main(String[] s) throws VTDException{ VTDGen vg = new VTDGen(); if (!vg.parseFile("input.xml", true)) return; VTDNav vn = vg.getNav(); AutoPilot ap = new AutoPilot(vn); // first manually navigate if(vn.toElement(VTDNav.FC,"tag")){ int i= vn.getText(); if (i!=-1){ System.out.println("text ===>"+vn.toString(i)); } if (vn.toElement(VTDNav.NS,"tag")){ i=vn.getText(); System.out.println("text ===>"+vn.toString(i)); } } // second version use XPath ap.selectXPath("/add/tag/text()"); int i=0; while((i=ap.evalXPath())!= -1){ System.out.println("text node ====>"+vn.toString(i)); } } }

  • c#:如何在webSockets hybi 08+中解構資料幀?
  • 使用Excel VBA获取共享點檔案夹的內容