gpt4 book ai didi

xml - 使用带有命名空间的 XPath 选择 3 个元素,但按属性对其进行过滤(仅限 Firefox)

转载 作者:行者123 更新时间:2023-12-04 16:57:42 24 4
gpt4 key购买 nike

我有一个 Blog structure XML带有命名空间。我没有任何问题printing all the posts title, date and content - 虽然它只能在 Firefox 上正常工作(仅在版本 35 上测试)。

我的计划是添加一个 选择 标签,以便用户可以按语言过滤帖子。我试过 许多 不同的东西,但它们都不起作用。不确定是浏览器限制还是错误编码。

以下是三个主要文件:

  • blog.xml
  • author.xsd
  • blog.xsd
  • posts.xsd

  • 虽然你可以看到我的 source code here ,这里是主要的JS方法:
        function LoadXMLWithXPath() {                           // load post titles and content using XPath
    xmlDoc = loadXMLDoc(); // get XML content
    var xml = xmlDoc.responseXML;

    var path = "//p:title|//p:content|//p:date"; // get all titles and its content
    var addContent = "";

    if (typeof xml.evaluate !== 'undefined') { // if XML is not null. Enough for most browsers.


    /*
    * xml.evaluate ( xpathExpression, contextNode, namespaceResolver, resultType, result )
    */
    var result = xml.evaluate(path, xml, // 'result' is a XPathResult object
    function (prefix) {
    switch (prefix) { // namespace resolver
    case 'b': return 'http://www.familiagrissi.com/blog';
    case 'a': return 'http://www.familiagrissi.com/authors';
    case 'p': return 'http://www.familiagrissi.com/posts';
    default: null;
    }
    }, XPathResult.ANY_TYPE, null);

    var nodes = xml.evaluate(path, xml,
    function (prefix) {
    switch (prefix) {
    case 'b': return 'http://www.familiagrissi.com/blog';
    case 'a': return 'http://www.familiagrissi.com/authors';
    case 'p': return 'http://www.familiagrissi.com/posts';
    default: null;
    }
    }, XPathResult.ANY_TYPE, null);

    var result = nodes.iterateNext(); // store the nodes content on the result object

    title = true;
    date = false;
    content = false;

    hr = 0;

    testing = "";

    while (result) {
    if (hr % 3 == 0) {
    addContent += '';
    }

    if (title) {
    addContent += "<b>Title: </b>" + (result.childNodes[0].nodeValue) + "<br />";
    title = false;
    date = true;
    } else if (date) {
    addContent += "<b>Date: </b>" + (result.childNodes[0].nodeValue) + "<br />";
    date = false;
    content = true;
    } else if (content) {
    addContent += "<div class='article'><p><b>Content: </b>" + (result.childNodes[0].nodeValue) + "<p></div>";
    content = false;
    title = true;
    }
    hr++;
    if (hr % 3 == 0) {
    addContent += "<hr />";
    }

    result = nodes.iterateNext();
    }
    }
    else if (typeof xml.selectNodes !== 'undefined' && typeof xml.setProperty != 'undefined') {
    // For IE only
    xml.setProperty('SelectionLanguage', 'XPath');
    xml.setProperty('SelectionNamespaces', 'xmlns:p="http://www.familiagrissi.com/posts"');
    var nodes = xml.selectNodes(path);

    var nodes = xml.selectNodes(path);

    for (i = 0; i < nodes.length; i++) { addContent += nodes[i].childNodes[0].nodeValue + "<br><hr />"; }
    }

    document.getElementById("loadPathXML").innerHTML = addContent;
    document.getElementById("testing").innerHTML = testing;
    }

    到目前为止,我最成功的尝试是仅打印帖子标题并按语言过滤:
            var language = "es";
    var path = "//p:title[@lang='" + language + "']";

    但是当将此方法与完整代码一起使用时,网站会过滤标题但加载所有日期和内容。

    我的想法已经用完了,所以任何想法都非常受欢迎。我会测试它并在此处发布结果。

    最佳答案

    有两个主要问题,与 JavaScript 无关。
    我在 .xml 文件的第一行代码中缺少文件夹名称。下面加粗。

    <b:blog xmlns:b="http://www.familiagrissi.com/blog" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.familiagrissi.com/blog/blog.xsd">

    另外,我对 XML 文件的逻辑是错误的。我有以下结构:
    <p:posts xmlns:p="http://www.familiagrissi.com/posts">
    <p:post id="P012">
    <p:title lang="es">Jorge Juan Crespo de la Serna</p:title>
    <p:author>Cristiano Maia</p:author>
    <p:date>2014-10-14</p:date>
    <p:content>Jorge Juan Crespo de la Serna (1887 – 24 julio de 19781 )...</p:content>
    </p:post>

    <p:post id="P011">
    <p:title lang="en">Lorem Ipsu</p:title>
    <p:author>Cristiano Maia</p:author>
    <p:date>2014-10-14</p:date>
    <p:content>Jorge Lorem IpsuLorem IpsuLorem Ipsude 19781 )...</p:content>
    </p:post>
    </p:posts>

    我试图用 lang="es"过滤所有帖子,但不可能成为其他内容的兄弟。所以我移动了属性 到父元素 p:post .
    <p:posts xmlns:p="http://www.familiagrissi.com/posts">
    <p:post id="P012" lang="es">
    <p:title>Jorge Juan Crespo de la Serna</p:title>
    <p:author>Cristiano Maia</p:author>
    <p:date>2014-10-14</p:date>
    <p:content>Jorge Juan Crespo de la Serna (1887 – 24 julio de 19781 )...</p:content>
    </p:post>

    <p:post id="P011" lang="en">
    <p:title>Lorem Ipsu</p:title>
    <p:author>Cristiano Maia</p:author>
    <p:date>2014-10-14</p:date>
    <p:content>Jorge Lorem IpsuLorem IpsuLorem Ipsude 19781 )...</p:content>
    </p:post>
    </p:posts>

    现在我可以使用以下路径并且它工作正常:
    var path = "//p:post[@lang='" + lang + "']/p:title|//p:post[@lang='" + lang + "']/p:content|//p:post[@lang='" + lang + "']/p:date";

    不是最干净的代码,但可以完成工作。
    可以在此处找到实时(2015 年 1 月 22 日)示例: http://www.familiagrissi.com/blog/ (但只能在 Firefox 上正常工作)。

    关于xml - 使用带有命名空间的 XPath 选择 3 个元素,但按属性对其进行过滤(仅限 Firefox),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28035154/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com