XPath के साथ नाम स्थान की उपेक्षा कैसे करें


111

मेरा लक्ष्य XPath का उपयोग करके कई नामस्थानों के साथ कई xml फ़ाइलों से कुछ नोड्स निकालना है। जब तक मुझे नामस्थान URI पता है सब कुछ ठीक काम करता है। नाम स्थान का नाम स्वयं स्थिर रहता है, लेकिन स्कीमा (XSD) कभी-कभी ग्राहक-जनित होते हैं अर्थात मेरे लिए अज्ञात हैं। फिर मैं मूल रूप से तीन विकल्पों के साथ छोड़ दिया गया हूं:

  1. नेमस्पेस के लिए सिर्फ एक स्कीमा का उपयोग करें, उम्मीद है कि कुछ भी गलत नहीं होगा (क्या मुझे यकीन है?)

  2. बच्चों को दस्तावेज़ के नोड्स प्राप्त करें और एक नेमस्पेस यूआरआई के साथ पहले नोड की तलाश करें, यह उम्मीद करते हैं कि यूआरआई का उपयोग करें और इसके सही होने की उम्मीद करें। कई कारणों से गलत हो सकता है

  3. किसी तरह xpath को बताएं: "देखो, मैं नामस्थानों की परवाह नहीं करता, बस इस नाम के साथ सभी नोड्स ढूंढता हूं, मैं आपको नामस्थान का नाम भी बता सकता हूं, बस यूआरआई नहीं"। और यहीं सवाल है ...

यह कई "मेरी xpath अभिव्यक्ति का काम नहीं करता है क्योंकि मैं नाम स्थान जागरूकता के बारे में पता नहीं है" सवाल यहाँ या यहाँ पाए गए । मुझे पता है कि नाम स्थान जागरूकता का उपयोग कैसे करना है। बस इससे छुटकारा नहीं है।


2
यदि आप स्कीमा को नहीं जानते हैं, तो आप कैसे जानते हैं कि आपको क्या तत्व चाहिए?
पॉल बुचर


1
आपको बताने के लिए धन्यवाद, एलेजांद्रो। "नेमस्पेस एक्सपैथ को नजरअंदाज करें" इस खोज का खुलासा किया जाना चाहिए था, लेकिन यह नहीं किया
kostja

2
@kostja: SO खोज बॉक्स के साथ खोज न करें, यह बेकार है ... अगली बार Google का प्रयास करें। वास्तव में, यह एसओ टीम द्वारा प्रोत्साहित किया जाता है।

1
Google साइट खोज वास्तव में SO पर उपयोगी सामान खोजने में बेहतर काम करती है। मुझे आश्चर्य है कि इसका डिफ़ॉल्ट प्रति विकल्प क्यों नहीं है। फिर से धन्यवाद, एलेजांद्रो
kostja

जवाबों:


164

आप local-name()XPath फ़ंक्शन का उपयोग कर सकते हैं । बजाय एक नोड का चयन करने की तरह

/path/to/x:somenode

आप सही स्थानीय नाम के साथ सभी नोड्स और फिल्टर का चयन कर सकते हैं:

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

9
आप local-name()विशेषताओं के साथ-साथ एक नाम स्थान-अनजान तरीके से भी संदर्भित करने के लिए उपयोग कर सकते हैं , देखें: stackoverflow.com/q/21239181/274677
मार्कस जुनियस ब्रूटस

इस ट्यूटोरियल पर एक नज़र डालें: codeimplify.com/java/java-xpath-ignore-namespace-example
hipokito

1
बहुत आसन। मेरी दोपहर बच गई।
सी जॉनसन


2

आप XmlTextReader पर Namespace = false का उपयोग कर सकते हैं

[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;

XPath के माध्यम से नोड चुनने के लिए, यह काम करता है; दुर्भाग्य से आप एक 'The 'xmlns' attribute is bound to the reserved namespaceत्रुटि के कारण दस्तावेज़ को सहेजने में सक्षम नहीं हैं ।
ऑटोमेटेडचौड्स

2

या आप नाम का उपयोग कर सकते हैं ():

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

या केवल खोज विशेषताएँ:

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

यदि आप xml को एक पॉवरशेल ऑब्जेक्ट के रूप में खोलते हैं, तो यह नामस्थानों की उपेक्षा करता है:

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

0

यह Qt C ++ में मेरा उदाहरण है। Qt XPath 2.0 का समर्थन करता है:

    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>
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.