Синтаксический анализ jQuery XML с использованием пространств имен. - PullRequest
80 голосов
/ 12 мая 2009

Я новичок в jQuery и хотел бы проанализировать XML-документ.

Я могу анализировать обычный XML с пространствами имен по умолчанию, но с xml, например:

<xml xmlns:s="uuid:BDC6E3F0-6DA3-11d1-A2A3-00AA00C14882" xmlns:dt="uuid:C2F41010-65B3-11d1-A29F-00AA00C14882" xmlns:rs="urn:schemas-microsoft-com:rowset" xmlns:z="#RowsetSchema">
   <s:Schema id="RowsetSchema">
     <s:ElementType name="row" content="eltOnly" rs:CommandTimeout="30">
       <s:AttributeType name="ows_ID" rs:name="ID" rs:number="1">
        <s:datatype dt:type="i4" dt:maxLength="4" />
      </s:AttributeType>
       <s:AttributeType name="ows_DocIcon" rs:name="Type" rs:number="2">
        <s:datatype dt:type="string" dt:maxLength="512" />
      </s:AttributeType>
       <s:AttributeType name="ows_LinkTitle" rs:name="Title" rs:number="3">
        <s:datatype dt:type="string" dt:maxLength="512" />
      </s:AttributeType>
       <s:AttributeType name="ows_ServiceCategory" rs:name="Service Category" rs:number="4">
        <s:datatype dt:type="string" dt:maxLength="512" />
      </s:AttributeType>
    </s:ElementType>
  </s:Schema>
   <rs:data>
    <z:row ows_ID="2" ows_LinkTitle="Sample Data 1" />
    <z:row ows_ID="3" ows_LinkTitle="Sample Data 2" />
    <z:row ows_ID="4" ows_LinkTitle="Sample Data 3" />
  </rs:data>
</xml>

Все, чего я действительно хочу, это <z:row>.

Пока я занимаюсь:

$.get(xmlPath, {}, function(xml) {
    $("rs:data", xml).find("z:row").each(function(i) {
        alert("found zrow");
    });
}, "xml");

Действительно без удачи. Есть идеи? Спасибо.

Ответы [ 20 ]

2 голосов
/ 26 июля 2012

jQuery 1.7 не работает со следующими:

$(xml).find("[nodeName=a:IndexField2]")

Одним из решений, которое я получил для работы в Chrome, Firefox и IE, является использование селекторов, которые работают в IE, и селекторов, которые работают в Chrome, исходя из того факта, что один из способов работает в IE, а другой в Chrome: 1004 *

$(xml).find('a\\\\:IndexField2, IndexField2')

В IE это возвращает узлы, использующие пространство имен (Firefox и IE требуют пространство имен), а в Chrome селектор возвращает узлы на основе селектора без пространства имен. Я не проверял это в Safari, но он должен работать, потому что он работает в Chrome.

2 голосов
/ 23 февраля 2016

По состоянию на начало 2016 года для меня работает следующий синтаксис с jQuery 1.12.0:

  • IE 11 (11.0.9600.18204, обновление 11.0.28, KB3134815): .find("z\\:row")
  • Firefox 44.0.2: .find("z\\:row")
  • Chrome 44.0.2403.89m: .find("row")

Синтаксис .find("[nodeName=z:row]") не работает ни в одном из браузеров, упомянутых выше. Я не нашел способа применить пространство имен в Chrome.

Собрав все воедино, следующий синтаксис работает во всех браузерах, упомянутых выше: .find("row,z\\:row")

2 голосов
/ 09 ноября 2012

Мое решение (потому что я использую прокси Php) состоит в том, чтобы заменить: namespace на _ ... чтобы больше не возникало проблем с пространством имен; -)

Будьте проще!

1 голос
/ 25 апреля 2012

Как упомянуто выше, есть проблемы с вышеупомянутым решением с текущими браузерами / версиями jQuery - предложенный плагин также не работает полностью из-за проблем с регистром (nodeName как свойство иногда встречается верхний регистр). Итак, я написал следующую быструю функцию:

$.findNS = function (o, nodeName)
{
    return o.children().filter(function ()
    {
        if (this.nodeName)
            return this.nodeName.toUpperCase() == nodeName.toUpperCase();
        else
            return false;
    });
};

Пример использования:

$.findNS($(xml), 'x:row');
1 голос
/ 23 апреля 2014

содержание: $this.find("content\\:encoded, encoded").text()

- идеальное решение ...

1 голос
/ 22 июня 2017

Существует плагин jquery-xmlns для работы jQuery с пространствами имен в селекторах.

0 голосов
/ 18 июля 2013

Для браузеров Webkit вы можете просто не использовать двоеточие. Например, чтобы найти <media:content> в RSS-канале, вы можете сделать следующее:

$(this).find("content");
0 голосов
/ 08 июня 2013

просто заменил пространство имен пустой строкой. У меня отлично работает. Проверенное решение для браузеров: Firefox, IE, Chrome

Моя задача состояла в том, чтобы прочитать и проанализировать EXCEL-файл с помощью Sharepoint EXCEL REST API. XML-ответ содержит теги с пространством имен «x:».

Я решил заменить пространство имен в XML пустой строкой. Работает так: 1. Получить интересующий узел из XML-ответа 2. Преобразовать выбранный узел XML-Response (Document) в строку 2. Заменить пространство имен пустой строкой 3. Конвертировать строку обратно в XML-документ

См. Схему кода здесь ->

function processXMLResponse)(xData)
{
  var xml = TOOLS.convertXMLToString("", "",$(xData).find("entry content")[0]);
  xml = xml.replace(/x:/g, "");            // replace all occurences of namespace
  xData =  TOOLS.createXMLDocument(xml);   // convert string back to XML
}

Для преобразования XML в строку найдите решение здесь: http://www.sencha.com/forum/showthread.php?34553-Convert-DOM-XML-Document-to-string

0 голосов
/ 23 января 2018

Кроме того, вы можете использовать fast-xml-parser в своем проекте и конвертировать данные XML в объект JS / JSON. Затем вы можете использовать его как свойство объекта. Он не использует JQuery или другие библиотеки, но решит вашу задачу.

var xmlData = '<xml xmlns:s="uuid:BDC6E3F0-6DA3-11d1-A2A3-00AA00C14882" xmlns:dt="uuid:C2F41010-65B3-11d1-A29F-00AA00C14882" xmlns:rs="urn:schemas-microsoft-com:rowset" xmlns:z="#RowsetSchema">'
+'   <s:Schema id="RowsetSchema">'
+'     <s:ElementType name="row" content="eltOnly" rs:CommandTimeout="30">'
+'       <s:AttributeType name="ows_ID" rs:name="ID" rs:number="1">'
+'        <s:datatype dt:type="i4" dt:maxLength="4" />'
+'      </s:AttributeType>'
+'       <s:AttributeType name="ows_DocIcon" rs:name="Type" rs:number="2">'
+'        <s:datatype dt:type="string" dt:maxLength="512" />'
+'      </s:AttributeType>'
+'       <s:AttributeType name="ows_LinkTitle" rs:name="Title" rs:number="3">'
+'        <s:datatype dt:type="string" dt:maxLength="512" />'
+'      </s:AttributeType>'
+'       <s:AttributeType name="ows_ServiceCategory" rs:name="Service Category" rs:number="4">'
+'        <s:datatype dt:type="string" dt:maxLength="512" />'
+'      </s:AttributeType>'
+'    </s:ElementType>'
+'  </s:Schema>'
+'   <rs:data>'
+'    <z:row ows_ID="2" ows_LinkTitle="Sample Data 1" />'
+'    <z:row ows_ID="3" ows_LinkTitle="Sample Data 2" />'
+'    <z:row ows_ID="4" ows_LinkTitle="Sample Data 3" />'
+'  </rs:data>'
+'</xml>'

var jsObj = parser.parse(xmlData,{attrPrefix:"",ignoreTextNodeAttr: false});
document.write(JSON.stringify(jsObj.xml["rs:data"]["z:row"][0],null,4) + "<br>");
document.write(JSON.stringify(jsObj.xml["rs:data"]["z:row"][1],null,4) + "<br>");
document.write(JSON.stringify(jsObj.xml["rs:data"]["z:row"][2],null,4) + "<br>");
<script src="https://cdnjs.cloudflare.com/ajax/libs/fast-xml-parser/2.9.2/parser.min.js"></script>

Вы можете игнорировать пространства имен при разборе объекта js / json. В этом случае вы можете получить прямой доступ как jsObj.xml.data.row.

for(var i=0; i< jsObj.xml.data.row.length; i++){
  console.log(jsObj.xml.data.row[i]);
}

Отказ от ответственности : я создал fast-xml-parser.

0 голосов
/ 13 мая 2009

Я не видел никакой документации по использованию JQuery для разбора XML. JQuery обычно использует Dom Browser для просмотра HTML-документа, я не верю, что он сам читает html.

Вероятно, вам стоит взглянуть на встроенную обработку XML в самом JavaScript.

http://www.webreference.com/programming/javascript/definitive2/

...