এক্সপথের সাথে কীভাবে নেমস্পেসগুলি উপেক্ষা করবেন


111

আমার লক্ষ্য হ'ল এক্সপ্যাথ ব্যবহার করে একাধিক নেমস্পেসের সাথে একাধিক এক্সএমএল ফাইলগুলি থেকে নির্দিষ্ট নোডগুলি বের করা। যতক্ষণ আমি নেমস্পেস ইউআরআই জানি ততক্ষণ সবকিছু ঠিকঠাক কাজ করে। নেমস্পেসের নামটি নিজেই স্থির থাকে, তবে স্কিমাস (এক্সএসডি) কখনও কখনও ক্লায়েন্ট-উত্পাদিত অর্থাৎ আমার কাছে অজানা। তারপরে আমার কাছে মূলত তিনটি পছন্দ রয়েছে:

  1. কিছুই ভুল না হওয়ার আশায় নামের জায়গার জন্য মাত্র একটি স্কিমা ব্যবহার করুন (আমি কী নিশ্চিত?)

  2. শিশুদের নথির নোডগুলি পান এবং একটি নেমস্পেস ইউআরআই সহ প্রথম নোডটি সন্ধান করুন, এটির আশায় এবং ঠিক এটির সঠিক আশা করে কেবল ইউআরআই ব্যবহার করুন। একাধিক কারণে ভুল হতে পারে

  3. একরকম এক্সপাথকে বলুন: "দেখুন, আমি নেমস্পেসগুলি সম্পর্কে যত্ন নিই না, কেবল এই নামের সাথে সমস্ত নোড খুঁজে পাই, আমি এমনকি ইউআরআই নয়, আপনাকে নামের জায়গার নামটিও বলতে পারি"। এবং এই এখানে প্রশ্ন ...

এটি "আমার এক্সপথ এক্সপ্রেশনটি কাজ করে না বলে একটি পুনরাবৃত্তি নয় কারণ এখানে বা এখানে পাওয়া যায় এমন প্রশ্নগুলির সাথে আমি নামস্পেস সচেতনতা সম্পর্কে সচেতন নই" । নেমস্পেস সচেতনতা কীভাবে ব্যবহার করতে হয় তা আমি জানি। কীভাবে এটি থেকে মুক্তি পাবেন তা নয় not


2
আপনি যদি স্কিমাগুলি জানেন না, তবে কী কী উপাদানগুলি চান তা আপনি কীভাবে জানবেন?
পল কসাই

4

1
আলেজান্দ্রো নির্দেশ করার জন্য আপনাকে ধন্যবাদ। "নেমস্পেস এক্সপথ উপেক্ষা করুন" এর অনুসন্ধানে এটি প্রকাশ করা উচিত ছিল, তবে তা হয়নি
kostja

2
@ কোস্টজা: এসও অনুসন্ধান বাক্স দিয়ে অনুসন্ধান করবেন না, এটি অকেজো ... পরের বার গুগল চেষ্টা করুন। আসলে, এসও দল এটি উত্সাহিত করেছে।

1
গুগল সাইটসারচ আসলে এসও-তে দরকারী জিনিসগুলি সন্ধানে আরও ভাল কাজ করে। আমি অবাক হয়েছি কেন এটি ডিফল্ট হিসাবে কোনও বিকল্প নয়। আবার ধন্যবাদ, আলেজান্দ্রো
কোস্টজা

উত্তর:


164

আপনি local-name()এক্সপথ ফাংশনটি ব্যবহার করতে পারেন । পরিবর্তে পছন্দ মতো নোড নির্বাচন করুন

/path/to/x:somenode

আপনি সমস্ত নোড নির্বাচন করতে পারেন এবং সঠিক স্থানীয় নামের সাথে একটিটির জন্য ফিল্টার করতে পারেন:

/path/to/*[local-name() = 'somenode']

9
আপনি local-name()নামটি-অজানা উপায়েও
মার্কাস জুনিয়াস ব্রুটাস

এই টিউটোরিয়ালটি একবার দেখুন: কোডিম্প্লিফাইটিও
জাভা- এক্সপ্যাট-

1
খুবই সোজা. আমার বিকেল বাঁচা
সি জনসন


2

আপনি XMLTextReader এ নেমস্পেস = মিথ্যা ব্যবহার করতে পারেন

[TestMethod]
public void MyTestMethod()
{
    string _withXmlns = @"<?xml version=""1.0"" encoding=""utf-8""?>
<ParentTag xmlns=""http://anyNamespace.com"">
<Identification value=""ID123456"" />
</ParentTag>
";

    var xmlReader = new XmlTextReader(new MemoryStream(Encoding.Default.GetBytes(_withXmlns)));

    xmlReader.Namespaces = false;

    var content = XElement.Load(xmlReader);

    XElement elem = content.XPathSelectElement("/Identification");

    elem.Should().NotBeNull();
    elem.Attribute("value").Value.Should().Be("ID123456");
}

সঙ্গে :

using System;
using System.IO;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Linq;
using System.Xml.XPath;
using FluentAssertions;
using Microsoft.VisualStudio.TestTools.UnitTesting;

এক্সপথের মাধ্যমে নোড নির্বাচনের জন্য, এটি কাজ করে; দুর্ভাগ্যক্রমে আপনি একটি 'The 'xmlns' attribute is bound to the reserved namespaceত্রুটির কারণে দস্তাবেজটি সংরক্ষণ করতে পারবেন না ।
অটোমেটেড

2

অথবা আপনি নাম () ব্যবহার করতে পারেন:

/path/to/*[name() = 'somenode']

অথবা কেবল অনুসন্ধানের বৈশিষ্ট্যগুলি:

//*[@attribute="this one"]

আপনি যদি এক্সএমএলটিকে পাওয়ারশেল অবজেক্ট হিসাবে খোলেন, তবে এটি নেমস্পেসগুলি উপেক্ষা করবে:

[xml]$xml = get-content file.xml
$xml.path.to.somenode

0

এটি Qt C ++ এ আমার উদাহরণ। কিউটি এক্সপ্যাথ ২.০ সমর্থন করে:

    QString planePath = ":/Models/Plane.dae";
    QFile f(planePath);
    if (!f.open(QIODevice::ReadOnly))
    {
        std::cerr << "Failed to load the file: " <<
                     planePath.toStdString() << std::endl;
        return;
    }

    QXmlQuery query;
    query.bindVariable("myFile", &f);
//    query.setQuery("doc($myFile)//*[local-name() = 'p']/text()"); // it works too but it is XPath 1.0
    query.setQuery("doc($myFile)//*:p/text()");

    QString result;
    query.evaluateTo(&result);
    qDebug() << result;
    f.close();

প্রোগ্রাম আউটপুট: "1 0 0 2 0 1 0 0 2 1 0 3 3 0 4 2 0 5\n"

Plane.dae

<?xml version="1.0" encoding="utf-8"?>
<COLLADA xmlns="http://www.collada.org/2005/11/COLLADASchema" version="1.4.1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <asset>
    <contributor>
      <author>Blender User</author>
      <authoring_tool>Blender 2.83.3 commit date:2020-07-22, commit time:06:01, hash:353e5bd7493e</authoring_tool>
    </contributor>
    <created>2020-08-03T14:03:19</created>
    <modified>2020-08-03T14:03:19</modified>
    <unit name="meter" meter="1"/>
    <up_axis>Z_UP</up_axis>
  </asset>
  <library_effects>
    <effect id="PlaneMaterial-effect">
      <profile_COMMON>
        <technique sid="common">
          <lambert>
            <emission>
              <color sid="emission">0 0 0 1</color>
            </emission>
            <diffuse>
              <color sid="diffuse">0.01664001 0.8000001 0.01191879 1</color>
            </diffuse>
            <reflectivity>
              <float sid="specular">0.5</float>
            </reflectivity>
          </lambert>
        </technique>
      </profile_COMMON>
    </effect>
  </library_effects>
  <library_images/>
  <library_materials>
    <material id="PlaneMaterial-material" name="PlaneMaterial">
      <instance_effect url="#PlaneMaterial-effect"/>
    </material>
  </library_materials>
  <library_geometries>
    <geometry id="Plane-mesh" name="Plane">
      <mesh>
        <source id="Plane-mesh-positions">
          <float_array id="Plane-mesh-positions-array" count="12">-1 -1 0 1 -1 0 -1 1 0 1 1 0</float_array>
          <technique_common>
            <accessor source="#Plane-mesh-positions-array" count="4" stride="3">
              <param name="X" type="float"/>
              <param name="Y" type="float"/>
              <param name="Z" type="float"/>
            </accessor>
          </technique_common>
        </source>
        <source id="Plane-mesh-normals">
          <float_array id="Plane-mesh-normals-array" count="3">0 0 1</float_array>
          <technique_common>
            <accessor source="#Plane-mesh-normals-array" count="1" stride="3">
              <param name="X" type="float"/>
              <param name="Y" type="float"/>
              <param name="Z" type="float"/>
            </accessor>
          </technique_common>
        </source>
        <source id="Plane-mesh-map-0">
          <float_array id="Plane-mesh-map-0-array" count="12">1 0 0 1 0 0 1 0 1 1 0 1</float_array>
          <technique_common>
            <accessor source="#Plane-mesh-map-0-array" count="6" stride="2">
              <param name="S" type="float"/>
              <param name="T" type="float"/>
            </accessor>
          </technique_common>
        </source>
        <vertices id="Plane-mesh-vertices">
          <input semantic="POSITION" source="#Plane-mesh-positions"/>
        </vertices>
        <triangles material="PlaneMaterial-material" count="2">
          <input semantic="VERTEX" source="#Plane-mesh-vertices" offset="0"/>
          <input semantic="NORMAL" source="#Plane-mesh-normals" offset="1"/>
          <input semantic="TEXCOORD" source="#Plane-mesh-map-0" offset="2" set="0"/>
          <p>1 0 0 2 0 1 0 0 2 1 0 3 3 0 4 2 0 5</p>
        </triangles>
      </mesh>
    </geometry>
  </library_geometries>
  <library_visual_scenes>
    <visual_scene id="Scene" name="Scene">
      <node id="Plane" name="Plane" type="NODE">
        <matrix sid="transform">1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1</matrix>
        <instance_geometry url="#Plane-mesh" name="Plane">
          <bind_material>
            <technique_common>
              <instance_material symbol="PlaneMaterial-material" target="#PlaneMaterial-material">
                <bind_vertex_input semantic="UVMap" input_semantic="TEXCOORD" input_set="0"/>
              </instance_material>
            </technique_common>
          </bind_material>
        </instance_geometry>
      </node>
    </visual_scene>
  </library_visual_scenes>
  <scene>
    <instance_visual_scene url="#Scene"/>
  </scene>
</COLLADA>
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.