java - 将 xml 字符串作为文档传递,返回 null

标签 java xml stringbuilder domparser

我在stackoverflow上看到了很多类似的问题,并尝试了很多但仍然没有成功。所以发布我的问题。

这是我的程序:

  • 获取 xml 中响应的 http 输出。
  • 将响应存储在字符串中。
  • 使用 xml dom 解析器解析字符串。
  • 获取元素。

  •     <RESULTS>
    <DEVICE name="qwewewew">
    <PORT name="ilo">
    <DB_SOURCE>abncd</DB_SOURCE>
    <WIRE_TYPE>ilo</WIRE_TYPE>
    <CONNECTS>abncd</CONNECTS>
    </PORT>
    <PORT name="onboard-1">
    <DB_SOURCE>abncd</DB_SOURCE>
    <WIRE_TYPE>net</WIRE_TYPE>
    <CONNECTS>abncd</CONNECTS>
    </PORT>
    <PORT name="abncd">
    <DB_SOURCE>abncd</DB_SOURCE>
    <WIRE_TYPE/>
    <CONNECTS/>
    </PORT>
    <PORT name="abncd">
    <DB_SOURCE>abncd</DB_SOURCE>
    <WIRE_TYPE>fiber</WIRE_TYPE>
    <CONNECTS>abncd</CONNECTS>
    </PORT>
    <PORT name="power">
    <DB_SOURCE>abncd</DB_SOURCE>
    <WIRE_TYPE/>
    <CONNECTS/>
    </PORT>
    <PORT name="serial">
    <DB_SOURCE>abncd</DB_SOURCE>
    <WIRE_TYPE>serial</WIRE_TYPE>
    <CONNECTS>abncd</CONNECTS>
    </PORT>
    </DEVICE>
    </RESULTS>
    

    我的程序片段如下:
    String baseUrl = "http://abcd.eng.xyz.com/wiremap/index.php?action=search&page=0&port_name=&dev_type=like&output=xml&dev_name=w2-fiqa-058";
    String xmlRecords = get(baseUrl).asString();
    
    DocumentBuilderFactory factory2 = DocumentBuilderFactory.newInstance();
    
    factory2.setNamespaceAware(true);
    DocumentBuilder builder2 = factory2.newDocumentBuilder();
    Document document = builder2.parse(new ByteArrayInputStream(xmlRecords.getBytes()));
    String test = document.getTextContent();
    System.out.println("Value " +test);
    
    System.out.println(document);
    

    这里文档返回 null。我不确定我错过了什么。

    最佳答案

    org.w3c.dom.Node#getTextContent方法 promise 返回 null调用时:

  • DOCUMENT_NODE
  • DOCUMENT_TYPE_NODE
  • NOTATION_NODE

  • 参见文档 here .

    如果您想验证您的 Document包含预期的内容,或者通常迭代其节点,您可以迭代 getChildNodes .

    这是一个小递归方法,它将打印该 XML 字符串的一些调试信息,在一个独立的示例中。
    package test;
    
    import java.io.ByteArrayInputStream;
    
    import javax.xml.parsers.DocumentBuilder;
    import javax.xml.parsers.DocumentBuilderFactory;
    
    import org.w3c.dom.Document;
    import org.w3c.dom.Node;
    import org.w3c.dom.NodeList;
    
    public class Main {
    
        public static void main(String[] args) throws Exception {
            String test = "<RESULTS><DEVICE name=\"qwewewew\"><PORT name=\"ilo\"><DB_SOURCE>abncd</DB_SOURCE><WIRE_TYPE>ilo</WIRE_TYPE><CONNECTS>abncd</CONNECTS></PORT><PORT name=\"onboard-1\"><DB_SOURCE>abncd</DB_SOURCE><WIRE_TYPE>net</WIRE_TYPE><CONNECTS>abncd</CONNECTS></PORT><PORT name=\"abncd\"><DB_SOURCE>abncd</DB_SOURCE><WIRE_TYPE/><CONNECTS/></PORT><PORT name=\"abncd\"><DB_SOURCE>abncd</DB_SOURCE><WIRE_TYPE>fiber</WIRE_TYPE><CONNECTS>abncd</CONNECTS></PORT><PORT name=\"power\"><DB_SOURCE>abncd</DB_SOURCE><WIRE_TYPE/><CONNECTS/></PORT><PORT name=\"serial\"><DB_SOURCE>abncd</DB_SOURCE><WIRE_TYPE>serial</WIRE_TYPE><CONNECTS>abncd</CONNECTS></PORT></DEVICE></RESULTS>";
            DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
            factory.setNamespaceAware(true);
            DocumentBuilder builder = factory.newDocumentBuilder();
            Document document = builder.parse(new ByteArrayInputStream(test.getBytes("UTF-8")));
            NodeList list = document.getChildNodes();
            recurse(list);
        }
        static void recurse(NodeList list) {
            if (list == null || list.getLength() == 0) {
                return;
            }
            else {
                for (int i = 0; i < list.getLength(); i++) {
                    Node item = list.item(i);
                    System.out.println(item);
                    recurse(item.getChildNodes());
                }
            }
        }
    
    }
    

    输出
    [RESULTS: null]
    [DEVICE: null]
    [PORT: null]
    [DB_SOURCE: null]
    [#text: abncd]
    [WIRE_TYPE: null]
    [#text: ilo]
    [CONNECTS: null]
    [#text: abncd]
    [PORT: null]
    [DB_SOURCE: null]
    [#text: abncd]
    [WIRE_TYPE: null]
    [#text: net]
    [CONNECTS: null]
    [#text: abncd]
    [PORT: null]
    [DB_SOURCE: null]
    [#text: abncd]
    [WIRE_TYPE: null]
    [CONNECTS: null]
    [PORT: null]
    [DB_SOURCE: null]
    [#text: abncd]
    [WIRE_TYPE: null]
    [#text: fiber]
    [CONNECTS: null]
    [#text: abncd]
    [PORT: null]
    [DB_SOURCE: null]
    [#text: abncd]
    [WIRE_TYPE: null]
    [CONNECTS: null]
    [PORT: null]
    [DB_SOURCE: null]
    [#text: abncd]
    [WIRE_TYPE: null]
    [#text: serial]
    [CONNECTS: null]
    [#text: abncd]
    

    关于java - 将 xml 字符串作为文档传递,返回 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33098082/

    相关文章:

    java - 有或没有显式变量的多方法调用

    JavaFX 文本字段事件处理程序

    java - 如何检查Spring中@RequestParam类型的整数变量是否为 "empty"?

    java - 通过属性阅读器获取TextView的SetText

    java - 用字符或字符串替换下划线的有效方法

    c# - 为什么 object.Equals 和 instanceobject.Equals 不一样

    vb.net - 带VB.NET的ASP.NET-Winforms到Web-NullReferenceException字符串拆分/字符串生成器错误

    java - Spring Boot 调度程序 servlet 无法找到/映射静态内容

    javascript - 如果节点包含具有特定名称的子节点但出现错误,则尝试从 XML 中删除该节点

    c# - 从 `XPathNodeIterator` 转换为 `linq`