كيف أجعل Nokogiri يفهم مساحات الأسماء الخاصة بي؟

StackOverflow https://stackoverflow.com/questions/839082

  •  22-07-2019
  •  | 
  •  

سؤال

لدي مستند XML التالي:

<samlp:LogoutRequest ID="123456789" Version="2.0" IssueInstant="200904051217">
  <saml:NameID>@NOT_USED@</saml:NameID>
  <samlp:SessionIndex>abcdefg</samlp:SessionIndex>
</samlp:LogoutRequest>

أرغب في الحصول على محتوى SessionIndex (أي "abcdefg") للخروج منه.لقد حاولت هذا:

XPATH_QUERY = "LogoutRequest[@ID][@Version='2.0'][IssueInstant]/SessionIndex"
SAML_XMLNS  = 'urn:oasis:names:tc:SAML:2.0:assertion'
SAMLP_XMLNS = 'urn:oasis:names:tc:SAML:2.0:protocol'

require 'nokogiri'
doc = Nokogiri::XML(xml)
doc.xpath(XPATH_QUERY, 'saml' => SAML_XMLNS, 'samlp' => SAMLP_XMLNS)

لكني أحصل على الأخطاء التالية:

Nokogiri::XML::SyntaxError: Namespace prefix samlp on LogoutRequest is not defined
Nokogiri::XML::SyntaxError: Namespace prefix saml on NameID is not defined
Nokogiri::XML::SyntaxError: Namespace prefix samlp on SessionIndex is not defined

لقد حاولت إضافة مساحات الأسماء إلى استعلام XPath، لكن هذا لا يغير شيئًا.

لماذا لا أستطيع إقناع نوكوجيري بأن مساحات الأسماء صالحة؟

هل كانت مفيدة؟

المحلول

وأنها لا تبدو وكأنها مساحات الأسماء في هذه الوثيقة يتم الإعلان بشكل صحيح - يجب أن يكون هناك xmlns:samlp والصفات xmlns:saml على عقدة الجذر. في مثل هذه الحالات، Nokogiri يتجاهل أساسا مساحات الأسماء (لأنه لا يمكن رسم خريطة لها محددات أو الجرار)، لذلك يعمل كسباث الخاص بك إذا كنت إزالتها، أي بمعنى.

doc.xpath(XPATH_QUERY)

نصائح أخرى

أرى خيارين مختلفين لك:

  1. إزالة كافة مساحات الأسماء

    http://www.rubydoc.info/github/sparklemotion/nokogiri/Nokogiri/XML/Document#remove_namespaces%21-instance_method

    طريقة القوة الغاشمة للقيام بذلك.يمكن أن يؤدي إلى مشاكل حيث توجد تضاربات في مساحة الاسم.

  2. استخدم Collect_namespaces

    http://www.rubydoc.info/github/sparklemotion/nokogiri/Nokogiri/XML/Document#collect_namespaces-instance_method

    حل أفضل بكثير.يمكنك استخدام هذا مرة واحدة لتحديد مساحات الأسماء (على سبيل المثال في irb) وترميزها بشكل ثابت.

    أو

    استخدمه في وقت التشغيل وقم بتوفيره كوسيطة ثانية لـ https://www.rubydoc.info/github/sparklemotion/nokogiri/Nokogiri/XML/Searchable#xpath-instance_method

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top