我是javascript和xml的新手,在搜索xml文件中的值并显示相关节点值时遇到问题。我有记事本和IE 8一起工作,并试图关注search xml file for any occurrence in search string。我能够拼凑出一些无法获得工作代码的东西;但是,它只是带回我使用getElementsByTagName搜索的标签。
我正在处理由其他人生成的xml,我无法控制xml,所以对于每个,我甚至不知道该怎么称呼它们,我想称它们为记录集,?节点族?它可能没有所有领域。 示例:books->标题,作者,年份和价格 而另一个将是 示例:books->标题,作者,年份 所以我想按标题搜索并带回相关字段。我想看看是否有可能使用我可用的工具,没有jsquery,Ajax,XPath .... 我检查了w3学校http://www.w3schools.com/dom/prop_element_firstchild.asp,我认为我需要但是不能让搜索功能(从堆栈溢出链接)工作。
尝试添加我正在使用的最新代码;但是,我的大脑已经死了,似乎无法让它显示得很好。
XML =“test.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:
但如果我按“144240”进行搜索,则只会写:
但是现在我得到的只是:
未找到:0 | nodeName:XML_x0020_Export | nodeValue:null
父节点= dataroot
未找到:1 | nodeName:XML_x0020_Export | nodeValue:null
父节点= dataroot
未找到:2 | nodeName:XML_x0020_Export | nodeValue:null
父节点= dataroot
答案 0 :(得分:1)
好的,我已经修好了几件事。首先,你不会真的尝试在本地加载一个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,Status,Etc)。然后我们再次想要从我们的数组的起始索引(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>