Javascript通过Tag搜索XML并获取兄弟节点

标签 javascript html xml

我是 javascript 和 xml 新手,在搜索 xml 文件中的值并显示相关节点值时遇到问题。我有记事本和 IE 8 可以使用,并试图遵循 search xml file for any occurrence in search string 。我能够拼凑出一些可行的东西,但无法让代码发挥作用;但是,它只是带回我使用 getElementsByTagName 搜索的标签。

我正在使用由其他人生成的 xml,并且我无法控制该 xml,因此对于每个 xml,我什至不知道如何调用它们,我想将它们称为记录集,?节点系列?它可能没有所有字段。 示例:书籍 -> 标题、作者、年份和价格 而另一个将是 示例:书籍 -> 书名、作者、年份 所以我想按标题搜索并带回相关字段。我想看看使用我可用的工具是否可以实现这一点,没有 jsquery、Ajax、XPath... 我检查了w3学校http://www.w3schools.com/dom/prop_element_firstchild.asp它有我认为我需要的东西,但无法使搜索功能(来自堆栈溢出链接)工作。

尝试添加我正在使用的最新代码;但是,我的大脑已经死了,似乎无法让它很好地发挥作用。

XML =“测试.xml”

<?xml version="1.0" encoding="UTF-8" ?> 
  <dataroot>
  <XML_x0020_Export>
  <ID>142450</ID> 
  <LI>B</LI> 
  <FI>G</FI> 
  <Status>Available</Status> 
  <Status-Date>2014-11-14T00:00:00</Status-Date> 
  <Status-Loc>Web</Status-Loc> 
  </XML_x0020_Export>
  <XML_x0020_Export>
  <ID>144230</ID> 
  <LI>F</LI> 
  <FI>T</FI> 
  <Status>Available</Status> 
  <Status-Date>2014-11-14T00:00:00</Status-Date> 
  <Status-Loc>In House</Status-Loc> 
  </XML_x0020_Export>
  <XML_x0020_Export>
  <ID>144240</ID> 
  <LI>F</LI> 
  <FI>P</FI> 
  <Status>NA</Status> 
  </XML_x0020_Export>
  </dataroot>

HTML =“new_test.htm”

<!DOCTYPE html>
 <head>
  <title>Read XML in Microsoft Browsers</title>
  <script type="text/javascript">
    var xmlDoc;
    function loadxml()
    {
      xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
      xmlDoc.async = false;
      xmlDoc.onreadystatechange = readXML;
      xmlDoc.load("test.xml");
    }
    function readXML()
    {
       if(xmlDoc.readyState == 4)
       {
    var foundElements = []; 
    arrayOfElements = xmlDoc.getElementsByTagName("XML_x0020_Export");
    for (i=0;i<arrayOfElements.length;i++)
        {
        if (arrayOfElements[i].ID == 144230) 
            {           
            foundElements.push(arrayOfElements[i]);
            document.write("<br>" + "Match Found: " + i);
            document.write("<br>");
            }
        for (i=0;i<arrayOfElements.length;i++)
            {
            document.write("<br>");
            document.write("Not Found: " + i + "|nodeName: " + " " + arrayOfElements[i].nodeName + "|nodeValue: " + arrayOfElements[i].nodeValue);
            document.write("<br>" + "Parent Node = " + arrayOfElements[1].parentNode.nodeName); 
            }
        }
    }
    }
  </script>
 </head>
 <body onload="loadxml();">
 </body>
</html>

我希望得到一些东西,这样我就可以写入 html:

  1. ID = 144230; LI=F; FI=T;状态 = 可用;状态-日期 = 2014-11-14T00:00:00; Status-Loc = 内部

但是如果我搜索“144240”,它只会写:

  1. ID = 144240; LI=F; FI=P;状态=不适用

但现在我得到的是:

未找到:0|节点名称:XML_x0020_Export|节点值:null

父节点=dataroot

未找到:1|节点名称:XML_x0020_Export|节点值:null

父节点=dataroot

未找到:2|节点名称:XML_x0020_Export|节点值:null

父节点=数据根

最佳答案

好的,我已经修复了一些问题。首先,您不会真正尝试在本地加载 xml 文件...您可以从 Web 服务或类似的东西获取 xml 文件,然后对其进行操作。这个问题已经在堆栈溢出上得到了多次回答,我已经将其从您的情况的复杂性中删除了。因此,我已将您的 xml 文件转换为字符串,并使用新行将其连接起来。

其次,我认为我应该浏览一下代码行,边解释边解释。

var foundElements = []; 
arrayOfElements = xmlDoc.getElementsByTagName("XML_x0020_Export");

这没有改变,我们实例化数组并使用 xml 元素加载它。

for (i=0;i<arrayOfElements.length;i++)

这将启动一个循环。我们想要循环遍历数组的起始索引 (0),直到达到数组的长度,并在每次迭代时将计数器加 1。

var output = "";

这是我们实例化每个元素的输出字符串。

for (x=0; x<arrayOfElements[i].childNodes.length; x++) {

这将在我们的循环中启动第二个循环。我们想要迭代上一个循环的每个 xml 元素中的 XML 节点。我们使用 arrayOfElements[i].childNodes 返回所有子节点(ID、状态等)。然后,我们再次希望从数组的起始索引 (0) 开始,直到到达子节点的末尾。

if (arrayOfElements[i].childNodes[x].nodeType == 1) {    

我们只想对nodeType为1的节点进行操作。这些是我们的属性节点,包含我们真正关心的数据。

output += arrayOfElements[i].childNodes[x].nodeName + ": " + arrayOfElements[i].childNodes[x].firstChild.nodeValue + "\n";

然后我们将字符串与子节点名称(标题)和值(值)连接起来。

document.write(output);
document.write("<br>");

一旦我们到达元素中的最后一个节点,我们想要写入 html,并循环到下一个元素。

这一切都对我有用,它应该可以帮助您了解如何导航 xml 文档。您似乎没有使用的一件事是 Javascript 的内置调试。我不确定如果没有这个,JavaScript 编程会有多复杂,这对我写这篇回复至关重要。

https://developer.chrome.com/devtools/docs/javascript-debugging

最终代码:

<!DOCTYPE html>
 <head>
  <title>Read XML in Microsoft Browsers</title>
  <script type="text/javascript">
    var xmlDoc;
    function loadxml()
    {
      parser=new DOMParser();
      xmlDoc=parser.parseFromString(  "<dataroot> \n" +
                                      "<XML_x0020_Export> \n" +
                                      "<ID>142450</ID>  \n" +
                                      "<LI>B</LI>  \n" +
                                      "<FI>G</FI>  \n" +
                                      "<Status>Available</Status>  \n" +
                                      "<Status-Date>2014-11-14T00:00:00</Status-Date>  \n" +
                                      "<Status-Loc>Web</Status-Loc>  \n" +
                                      "</XML_x0020_Export> \n" +
                                      "<XML_x0020_Export> \n" +
                                      "<ID>144230</ID>  \n" +
                                      "<LI>F</LI>  \n" +
                                      "<FI>T</FI>  \n" +
                                      "<Status>Available</Status>  \n" +
                                      "<Status-Date>2014-11-14T00:00:00</Status-Date>  \n" +
                                      "<Status-Loc>In House</Status-Loc>  \n" +
                                      "</XML_x0020_Export> \n" +
                                      "<XML_x0020_Export> \n" +
                                      "<ID>144240</ID>  \n" +
                                      "<LI>F</LI>  \n" +
                                      "<FI>P</FI>  \n" +
                                      "<Status>NA</Status>  \n" +
                                      "</XML_x0020_Export> \n" +
                                      "</dataroot>",
                                    "text/xml");
    }
    function readXML()
    {
        var foundElements = []; 
        arrayOfElements = xmlDoc.getElementsByTagName("XML_x0020_Export");
        for (i=0;i<arrayOfElements.length;i++)
            {
            var output = "";
            for (x=0; x<arrayOfElements[i].childNodes.length; x++) {
                if (arrayOfElements[i].childNodes[x].nodeType == 1) {    
                    output += arrayOfElements[i].childNodes[x].nodeName + ": " + arrayOfElements[i].childNodes[x].firstChild.nodeValue + "\n";
                }
            }
            document.write(output);
            document.write("<br>");
        }
    }
  </script>
 </head>
 <body onload="loadxml(); readXML()">
 </body>
</html>

关于Javascript通过Tag搜索XML并获取兄弟节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27116085/

相关文章:

xml - 如何在PowerShell中使用多个XML根元素拆分字符串?

javascript - 如何允许使用 Typescript 覆盖类方法?

javascript - 在 python 中抓取 javascript 页面

javascript - iCheck复选框全选,并刷新数据表

javascript - 传递具有自定义数据属性的函数

html - parent 高度自动的 child 的动态高度

php - 在 Html Forms 的 sql 表中记录信息时遇到问题

javascript - 使用水平滚动显示 Wordpress 帖子缩略图

c# - 在 C# 中使用命名空间创建特定的 XML 文档

ios - 获取元素的值而不解析ios中的所有xml文件