এক্সডোকামেন্টের সাথে এক্সপথ কীভাবে ব্যবহার করবেন?


109

একটি অনুরূপ প্রশ্ন রয়েছে, তবে মনে হচ্ছে সমাধানটি আমার ক্ষেত্রে কার্যকর হয়নি: এক্সডোকামেন্ট, এক্সপ্যাথ এবং নেমস্পেসের সাথে অদ্ভুততা

আমি যে এক্সএমএল নিয়ে কাজ করছি তা এখানে:

<?xml version="1.0" encoding="utf-8"?>
<Report Id="ID1" Type="Demo Report" Created="2011-01-01T01:01:01+11:00" Culture="en" xmlns="http://demo.com/2011/demo-schema">
    <ReportInfo>
        <Name>Demo Report</Name>
        <CreatedBy>Unit Test</CreatedBy>
    </ReportInfo>
</Report>

এবং নীচে কোডটি যা আমি ভেবেছিলাম এটি কাজ করা উচিত তবে তা হয়নি ...

XDocument xdoc = XDocument.Load(@"C:\SampleXML.xml");
XmlNamespaceManager xnm = new XmlNamespaceManager(new NameTable()); 
xnm.AddNamespace(String.Empty, "http://demo.com/2011/demo-schema");
Console.WriteLine(xdoc.XPathSelectElement("/Report/ReportInfo/Name", xnm) == null);

কারো কি কোন ধারনা আছে? ধন্যবাদ।


1
নীচের অন্য উত্তরটি দেখুন, এটি এক্সপথ 1.0 বাস্তবায়ন খালি উপসর্গটি সামলাতে পারে না বলে কাজ করে না
পল হ্যাচার

1
অন্যরা যেমন এখানে বলেছে, [XMLNamespaceManager] এ নেমস্পেস যুক্ত করার সময় একটি খালি উপসর্গ ব্যবহার করবেন না। আমি এই মন্তব্যটি কেবল যুক্ত করছি, যদি কেউ একটি দস্তাবেজের সাথে একটি ছোট কোডের উদাহরণ দেখতে চায় যার সাথে বেশ কয়েকটি [xMLns] বৈশিষ্ট্য রয়েছে, যার সাথে প্রত্যয় যুক্ত এবং ছাড়াও রয়েছে। : এখানে দেখুন stackoverflow.com/a/38272604/5838538
Jelgab

উত্তর:


158

যদি আপনার এক্সডোকামেন্ট থাকে তবে লিনিক-টু-এক্সএমএল ব্যবহার করা আরও সহজ:

var document = XDocument.Load(fileName);
var name = document.Descendants(XName.Get("Name", @"http://demo.com/2011/demo-schema")).First().Value;

আপনি যদি নিশ্চিত হন যে এক্সপথই আপনার একমাত্র সমাধান প্রয়োজন:

using System.Xml.XPath;

var document = XDocument.Load(fileName);
var namespaceManager = new XmlNamespaceManager(new NameTable());
namespaceManager.AddNamespace("empty", "http://demo.com/2011/demo-schema");
var name = document.XPathSelectElement("/empty:Report/empty:ReportInfo/empty:Name", namespaceManager).Value;

13
আমি বলব বেশিরভাগ ক্ষেত্রে এক্সপথের চেয়ে লিনাক বলা সহজ। উদাহরণস্বরূপ, এই ক্ষেত্রে লিনকুই সমতুল্য আসলে সমতুল্য নয় কারণ এটি অন্যান্য নোডের অধীনে "নাম" নোড পেতে পারে (যা এখন নেই তবে পরে ফাইলের ফর্ম্যাটে পরিবর্তনের মাধ্যমে যোগ করা যেতে পারে)। তবে আপনার সমাধান অবশ্যই সঠিক এক।
মার্কো এমপি

12
দ্রষ্টব্য: System.XML.XPath ব্যবহার করে; এক্সপ্যাথসিলিট এলিমেন্ট একটি এক্সটেনশন পদ্ধতি হওয়ায় এটি বেশ গুরুত্বপূর্ণ। আমি যেমন করেছিলাম তেমন করো না এবং সেই অংশটি উপেক্ষা করুন;)
মার্ক ভ্যান স্ট্রেন

7
এক্সপথ এখনও এটি সহায়ক যে এটি আপনাকে আপনার পিতামাতার সন্তানের সম্পর্কগুলিকে প্রাসঙ্গিক করার অনুমতি দেয়। যেমন আপনি প্রতিটি কলা পাওয়ার পরিবর্তে / কলা / কলা / কলা যেতে চান
সেবাস্তিয়ান প্যাটেন

2
"খালি" এখানে কিছুটা বিভ্রান্তিকর এবং বিভ্রান্তিকর। এক্সপ্যাথ, স্ট্রিং.এম্পটি (অনুরোধক হিসাবে আবিষ্কার করা হয়েছে) সহ আপনি ব্যতীত অন্য কিছু ব্যবহার করতে পারেন। "ডেমো" উদাহরণের জন্য আরও উপযুক্ত হবে।
টম ব্লডজেট

7

এক্সপথ 1.0, যা এমএস প্রয়োগ করে, এটি একটি ডিফল্ট নেমস্পেসের ধারণা রাখে না। সুতরাং এটি চেষ্টা করুন:

XDocument xdoc = XDocument.Load(@"C:\SampleXML.xml");
XmlNamespaceManager xnm = new XmlNamespaceManager(new NameTable()); 
xnm.AddNamespace("x", "http://demo.com/2011/demo-schema");
Console.WriteLine(xdoc.XPathSelectElement("/x:Report/x:ReportInfo/x:Name", xnm) == null);

8
আপনার উত্তরটি বোঝায় যে এক্সপথ ২.০, এক্সপথ ০.০ এর বিপরীতে "* একটি ডিফল্ট নেমস্পেসের" একটি ধারণা "রয়েছে such আমি এই জাতীয় নতুন এক্সপথ বৈশিষ্ট্য সম্পর্কে অবগত নই (আমরা এখানে এক্সপ্যাথের কথা বলছি, এক্সএসএলটি বা এক্সকুয়েরি নয়) সুতরাং, আপনি কি পারতেন? , দয়া করে, আপনি কী উত্তর দিচ্ছেন তা আপনার জবাবে স্পষ্টভাবে উল্লেখ করুন?
দিমিত্রে নোভাচাচেভ

2
আমি মনে করি তিনি এখানে যা পাচ্ছেন তা হ'ল যদি আপনার কাছে কোনও নথী থাকে যা একটি নেমস্পেসের সংজ্ঞা দেয় তবে আপনার এক্সপথে অবশ্যই যোগ্য উপাদান অন্তর্ভুক্ত থাকতে হবে, আপনি xnm.AddNamespace করতে পারবেন না (স্ট্রিং.এম্পটি, " ডেমো ডটকম / ১ / ডেমো- স্কেমা" ); এবং তারপরে xdoc.XPathSelectElement ("/ রিপোর্ট / রিপোর্টআইনফো / নাম", এক্সএনএম) - ফলাফল সর্বদা শূন্য হয়
পল হ্যাচার

3

আপনি মাইক্রোসফ্ট থেকে উদাহরণটি ব্যবহার করতে পারেন - নাম-স্থান ছাড়াই আপনার জন্য:

using System.Xml.Linq;
using System.Xml.XPath;
var e = xdoc.XPathSelectElement("./Report/ReportInfo/Name");     

এটা করা উচিত


আমার জন্য কাজ করে না
ব্যবহারকারী 1623521
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.