.NET এর এক্সএমএল ডকুমেন্ট থেকে আউটপুটে ফাঁকা xMLns বৈশিষ্ট্যগুলি কীভাবে প্রতিরোধ করবেন?


118

.NET- এ এক্সএমএল ডকুমেন্ট থেকে এক্সএমএল তৈরি xmlnsকরার সময় , কোনও ফাঁকা অ্যাট্রিবিউট প্রথমবার প্রদর্শিত হয় যখন কোনও যুক্ত নেমস্পেস ব্যতীত কোনও উপাদান ; োকানো হয় ; এই কিভাবে প্রতিরোধ করা যায়?

উদাহরণ:

XmlDocument xml = new XmlDocument();
xml.AppendChild(xml.CreateElement("root",
    "whatever:name-space-1.0"));
xml.DocumentElement.AppendChild(xml.CreateElement("loner"));
Console.WriteLine(xml.OuterXml);

আউটপুট:

<root xmlns="whatever:name-space-1.0"><loner xmlns="" /></root>

পছন্দসই আউটপুট:

<root xmlns="whatever:name-space-1.0"><loner /></root>

কোডটিতে কী কোনও সমাধান প্রযোজ্য XmlDocument, ডকুমেন্টটিকে স্ট্রিংয়ে রূপান্তর করার পরে ঘটেছিল এমন কিছু নয় OuterXml?

এটি করার জন্য আমার যুক্তিটি XMLDocament- উত্পাদিত XML ব্যবহার করে কোনও নির্দিষ্ট প্রোটোকলের মানক XML এর সাথে মেলে কিনা তা দেখতে। ফাঁকা xmlnsবৈশিষ্ট্যটি পার্সারকে ভেঙে ফেলতে বা বিভ্রান্ত করতে না পারে তবে আমি এই প্রোটোকলটি দেখেছি এমন কোনও ব্যবহারে এটি উপস্থিতও নেই।

উত্তর:


111

জেরেমি লিউর জবাব এবং আরও কিছুটা খেলতে পেরে ধন্যবাদ জানলাম, ফাঁকা xmlnsবৈশিষ্ট্যগুলি কীভাবে সরিয়ে ফেলতে হবে : কোনও শিশু নোড তৈরি করার সময় রুট নোডের নেমস্পেসে পাস করুন আপনি কোনও উপসর্গ রাখতে চান না । মূলটিতে উপসর্গ ব্যতীত একটি নেমস্পেস ব্যবহার করার অর্থ হ'ল চাইল্ড উপাদানগুলিতে তাদের উপসর্গ না থাকার জন্য আপনার সেই একই নেমস্পেসটি ব্যবহার করা উচিত

স্থির কোড:

XmlDocument xml = new XmlDocument();
xml.AppendChild(xml.CreateElement("root", "whatever:name-space-1.0"));
xml.DocumentElement.AppendChild(xml.CreateElement("loner", "whatever:name-space-1.0")); 
Console.WriteLine(xml.OuterXml);

সবাইকে আপনার উত্তরগুলির জন্য ধন্যবাদ যা আমাকে সঠিক পথে নিয়ে গেছে!


1
অবিকল। "যাই হোক না কেন: নাম-স্থান -১.০" নেমস্পেসে <লোনার> উপাদানটি রাখার অর্থ এটি সিরিয়ালযুক্ত হলে খালি এক্সএমএনএলস অ্যাট্রিবিউট (যা এটি কোনও নামস্থান রাখে না) এতে যুক্ত করা হবে না। নামের জায়গাগুলি
জেনিটি

2
সতর্কতা অবলম্বন করুন: উপাদানগুলির এটির প্রয়োজন হয় (বা সম্ভবত আরও ভাল doc.DocumentElement.NamespaceURI) তবে CreateAttribute()আপনি xmlns:psomethingএকই নামটি পেয়ে গেলেও কোনও নামস্থান নির্দিষ্ট করবেন না ।
জেসন ক্লেবান

87

এটি জেনিটির উত্তরের একটি রূপ (আপনাকে অনেক ধন্যবাদ বিটিডব্লিউ!)

XmlElement new_element = doc.CreateElement("Foo", doc.DocumentElement.NamespaceURI);

এটি সর্বত্র নেমস্পেস অনুলিপি করা বা পুনরাবৃত্তি করা বাদ দেয়।


3
আমার মতে সেরা সাড়া। ডকুমেন্ট ডিফল্ট নেমস্পেসটি কী তা আমাদের জানতে হবে না (যখন আমরা স্ক্র্যাচ থেকে কোনও এক্সএমএল ফাইল তৈরি করি না অর্থাত্ পঠন ও সংশোধন করার পরিস্থিতিতে)।
MuiBienCarlota

11

যদি <loner>আপনার নমুনা এক্সএমএল উপাদানটির xmlnsডিফল্ট নেমস্পেসের ডিক্লেয়ারেশন না থাকে তবে এটি whatever:name-space-1.0কোনও নামস্থান না হয়ে নামস্থানে থাকবে। যদি আপনি এটি চান তবে আপনার সেই নামের জায়গাতে উপাদানটি তৈরি করতে হবে:

xml.CreateElement("loner", "whatever:name-space-1.0")

যদি আপনি চান যে <loner>উপাদানটি কোনও নেমস্পেসে না থাকে, তবে এক্সএমএল তৈরি করা হয়েছে যা ঠিক আপনার প্রয়োজন, এবং আপনার xmlnsজন্য স্বয়ংক্রিয়ভাবে যুক্ত হওয়া গুণাবলী সম্পর্কে আপনার চিন্তা করা উচিত নয় ।


3
সমস্যাটি অনুপযুক্ত এক্সএমএল পার্সারগুলির সাথে থাকে (সাধারণত মাইক্রোসফ্ট থেকে) যা xmnls = "" এর সাথে মোকাবেলা করতে পারে না)।
ক্রেগ ট্রেডার 18

2
/। বলা হয়। তারা তাদের এলোমেলো এমএস বাশিংয়ের মন্তব্যটি আবার চান।

@W। ক্রেগ ব্যবসায়ী - আমি বলতে পারি না যে আমি এটি একটি সমস্যা হিসাবে এসেছি। উদাহরণ?
কেভ

1
ঠিক আছে, আমি চাই না <লোনার /> নোডের একটি নেমস্পেস থাকে, তবে আমি চাই না যে এটি ফাঁকা নেমস্পেস বৈশিষ্ট্য (xMLns) থাকে। আমার যুক্তিটি কেবলমাত্র এটি দেখার জন্য যে আমি কোনও নির্দিষ্ট প্রোটোকলের এক্সএমএল আউটপুটটির সাথে এটি মেলে কিনা যা এটির মতো সেটআপ রয়েছে।
নিল সি ওব্রেমস্কি

5
এটি এলোমেলোভাবে মারধর করা হয়নি। মাইক্রোসফ্ট আপডেটার অ্যাপ্লিকেশন ব্লক ক্লায়েন্টকে কী বিতরণ করবে তা নির্ধারণ করতে একটি এক্সএমএল ম্যানিফেস্ট ব্যবহার করে। দুর্ভাগ্যক্রমে, ম্যানিফেস্ট পার্সার xMLns = "" সাথে সামলাতে পারবেন না; আমাকে একটি পোস্ট প্রসেসর লিখতে হয়েছিল যা খালি xMLns বৈশিষ্ট্যগুলি সরিয়ে ফেলবে।
ক্রেগ ব্যবসায়ী

7

যেহেতু মূলটি একটি পূর্বনির্ধারিত নেমস্পেসে থাকে, সুতরাং যে কোনও রুট অন-নেমস্পিডে থাকতে চায় তার বাচ্চার আপনার উদাহরণের মতো আউটপুট হতে হয়। সমাধানটি হ'ল মূল উপাদানটিকে উপসর্গ করা হবে:

<w:root xmlns:w="whatever:name-space-1.0">
   <loner/>
</w:root>

কোড:

XmlDocument doc = new XmlDocument();
XmlElement root = doc.CreateElement( "w", "root", "whatever:name-space-1.0" );
doc.AppendChild( root );
root.AppendChild( doc.CreateElement( "loner" ) );
Console.WriteLine(doc.OuterXml);

ধন্যবাদ, তবে প্রকৃত মূলের সাথে নেমস্পেস যুক্ত করা আমি যে বিশেষ প্রোটোকলের সাথে কাজ করছি তার সাথে আমার এক্সএমএলকে ভেঙে দেয়।
নিল সি ওব্রেমস্কি

আহ! আপনি কী বলছেন তা আমি আরও উপলব্ধি করেছিলাম এবং আমার নিজের উত্তরটি লেখার সময় এটি অ্যাকাউন্টে নেওয়া হয়েছিল। ধন্যবাদ জেরেমি
নিল সি ওব্রেমস্কি

0

সম্ভব হলে সিরিয়ালাইজেশন ক্লাস তৈরি করুন তারপর করুন:

XmlSerializerNamespaces ns = new XmlSerializerNamespaces();
ns.Add("", "");
XmlSerializer serializer = new XmlSerializer(yourType);
serializer.Serialize(xmlTextWriter, someObject, ns);

এটি নিরাপদ এবং আপনার যদি সত্যিকার অর্থে আরও নিয়ন্ত্রণের প্রয়োজন হয় তবে আপনি গুণাবলী সহ নেমস্পেসগুলি নিয়ন্ত্রণ করতে পারেন।


0

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

internal class XElementFactory
{
    private readonly XNamespace currentNs;

    public XElementFactory(XNamespace ns)
    {
        this.currentNs = ns;
    }

    internal XElement CreateXElement(String name, params object[] content)
    {
        return new XElement(currentNs + name, content);
    }
}

1
ওপি জিজ্ঞাসা করছিল XmlDocument, না XDocument
জন স্যান্ডার্স

0

হ্যাঁ আপনি XMLNS থেকে XMLNS প্রতিরোধ করতে পারেন NS প্রথম তৈরির সময় এটি আসছে: এর মতো

<trkpt lat="30.53597" lon="-97.753324" xmlns="">
    <ele>249.118774</ele>
    <time>2006-05-05T14:34:44Z</time>
</trkpt>

কোডটি পরিবর্তন করুন: এবং এর মতো এক্সএমএল নেমস্পেস পাস করুন

সি # কোড:

XmlElement bookElement = xdoc.CreateElement("trkpt", "http://www.topografix.com/GPX/1/1");
bookElement.SetAttribute("lat", "30.53597");
bookElement.SetAttribute("lon", "97.753324");
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.