2009-03-05 8 views
7

तो मैं अभी भी पूछ रहा हूँ सवाल Xml क्रमबद्धता के बाद खाली xmlns निकालें = "" इसलिए मैं एक वस्तु बनाने के लिए, Xml क्रमबद्धता के साथ गुण यह सजाने, से मैं क्या देखा है मैं एक जोड़ने एक्सएमएल क्रमबद्धता namepsace संग्रह करने के लिए खाली नाम स्थान इतनी के रूप में ज़रूरत से ज़्यादा गुण प्राप्त करने के लिए नहीं मेरे पास है का इरादा नहीं थाइस विषय :-(</p> <p>के बारे में

संपादित करें:। विशेषता मेरा मतलब ये हैं:

<url xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"; xmlns:xsd="http://www.w3.org/2001/XMLSchema"; xmlns=""> 

तो यह मुझे दो देता है अतिरिक्त जिम्मेदार बताते हैं।

मैं से दस्तावेज़ की शुरुआत के परिवर्तित होने पर आगे की जांच पड़ताल करने के बाद: **

writer.WriteStartElement("urlset","http://www.sitemaps.org/schemas/sitemap/0.9"); 

को
writer.WriteStartElement("urlset"); 

** तो मैं खाली xmlns = "" में विशेषता नहीं मिलता यूआरएल टैग। यह बहुत अच्छा है लेकिन मैं की आवश्यकता होती है कि मूल तत्व xmlns="http://www.sitemaps.org/schemas/sitemap/0.9" है, यानी .:

<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"> 

लेकिन मैं अभी भी एक खाली xmlns="" धारावाहिक प्रकार में विशेषता मिलता है।

[XmlRoot(ElementName = "url", Namespace="")] 
public class SitemapNode 
{ 
    [XmlElement(ElementName = "loc")] 
    public string Location { get; set; } 
    [XmlElement(ElementName = "lastmod")] 
    public DateTime LastModified { get; set; } 
    [XmlElement(ElementName = "changefreq")] 
    public SitemapChangeFrequency ChangeFrequency { get; set; } 
    [XmlElement(ElementName = "priority")] 
    public decimal Priority { get; set; } 

    public SitemapNode() 
    { 
     Location = String.Empty; 
     LastModified = DateTime.Now; 
     ChangeFrequency = SitemapChangeFrequency.monthly; 
     Priority = 0.5M; 
    } 

    public SitemapNode(string location, DateTime lastModified, SitemapChangeFrequency changeFrequency, decimal priority) 
    { 
     Location = location; 
     LastModified = lastModified; 
     ChangeFrequency = changeFrequency; 
     Priority = priority; 
    } 
} 

तब मैं अपने XmlWriter में जोड़ने के लिए निम्नलिखित का उपयोग करें:

foreach (uk.co.andrewrea.SitemapNode node in List) 
{ 
    XmlSerializerNamespaces ns = new XmlSerializerNamespaces(); 
    ns.Add(String.Empty, String.Empty); 
    Serializer.Serialize(Writer, node, ns); 
} 

यह सिवाय मुझे इसमें कोई emtpy xmlns = "" इस

<url xmlns=""> 

किसी तरह छोड़ दिया हूँ बाहर ठीक काम करता है कोई विचार? फिर मैं XmlTextWriter और XmlDocument का उपयोग करके इसे प्राप्त कर सकता हूं लेकिन मुझे XmlWriter का उपयोग करके इसे प्राप्त करने की आवश्यकता है।

किसी भी मदद की बहुत सराहना की जाती है।

+0

> मैं एक्सएमएल सीरियलाइजेशन नेमस्पेस संग्रह में एक खाली नामस्थान जोड़ता हूं ताकि आवश्यक गुण न प्राप्त करने के लिए मैं नहीं चाहता था। क्या आप इस पर विस्तार कर सकते हैं? अनावश्यक गुणों से आपका क्या मतलब है? – jro

+0

> तो यह मुझे दो अतिरिक्त विशेषताओं देता है। –

उत्तर

12

यह काम करता है (आप बस उन्हें जरूरत ही नाम स्थान में हो और आप नामस्थान वर्ग उपयोग करती हैं इसलिए writter भ्रमित नहीं करता है):

[TestMethod] 
public void TestMethod3() 
{ 
    var list = new []{new SitemapNode("1", DateTime.Now, 1), new SitemapNode("2", DateTime.Now.AddDays(1), 2)}; 
    var serializer = new XmlSerializer(typeof(SitemapNode)); 
    var st = new MemoryStream(); 
    using (var writer = XmlWriter.Create(st)) 
    { 
     var ns = new XmlSerializerNamespaces(); 
     ns.Add("", "test"); 
     writer.WriteStartElement("test", "test"); 
     foreach (SitemapNode node in list) 
     { 
      serializer.Serialize(writer, node, ns); 
     } 
     writer.WriteEndElement(); 
    } 
    st.Position = 0; 
    TestContext.WriteLine(new StreamReader(st).ReadToEnd()); 
} 


[XmlRoot(ElementName = "url", Namespace = "test")] 
public class SitemapNode 
{ 
    [XmlElement(ElementName = "loc")] 
    public string Location { get; set; } 
    [XmlElement(ElementName = "lastmod")] 
    public DateTime LastModified { get; set; } 
    [XmlElement(ElementName = "priority")] 
    public decimal Priority { get; set; } 

    public SitemapNode() 
    { 
     Location = String.Empty; 
     LastModified = DateTime.Now; 
     Priority = 0.5M; 
    } 

    public SitemapNode(string location, DateTime lastModified, decimal priority) 
    { 
     Location = location; 
     LastModified = lastModified; 
     Priority = priority; 
    } 
} 

और आउटपुट (आपकी टिप्पणियों के आधार पर जो आप खोज रहे थे):

<?xml version="1.0" encoding="utf-8"?><test xmlns="test"> 
<url><loc>1</loc><lastmod>2009-03-05T13:35:54.6468-07:00</lastmod><priority>1</priority></url> 
<url><loc>2</loc><lastmod>2009-03-06T13:35:54.6478-07:00</lastmod><priority>2</priority></url></test> 
+1

अगर मैं आपको 50 अंक ऊपर चिह्नित कर सकता हूं तो मैं स्वयं !! महान पद, और इस मामले में आपके समय के लिए धन्यवाद। मैं वास्तव में इसकी प्रशंसा करता हूँ! एक इलाज किया। + 1 + उत्तर :-) –

+0

यह वही उदाहरण लें और इस संपत्ति को साइटमैप नोड में जोड़ें: [XmlElement (ElementName = "value")] सार्वजनिक स्ट्रिंग मान {प्राप्त करें; सेट; } क्यों सीरिएलाइज़र बस इसे इंगित करता है? – andrecarlucci

0

क्या आपने अपने XmlRoot विशेषता में नामस्थान निर्दिष्ट नहीं करने का प्रयास किया है?

Ie:

[XmlRoot(ElementName = "url")] 
public class SitemapNode 
{ 
... 
} 
+0

हां अभी भी वही है, यह एक खाली xmlns = "" –

+0

आउटपुट करता है और XmlSerializerNamespaces ns = new XmlSerializerNamespaces() को हटा देता है; ns. जोड़ें (स्ट्रिंग। लक्षण, स्ट्रिंग। लक्षण); भी? – cjk

+0

मैंने सोचा कि पहले लेकिन आउटपुट निम्नानुसार है: तो यह मुझे दो अतिरिक्त विशेषताओं देता है। –

3

मुझे एक नोड डालने में परेशानी हो रही थी कई नामस्थान के साथ मौजूदा दस्तावेज़।

इससे कोई फर्क नहीं पड़ता कि मैंने नामस्थान सेट किया है, इससे कोई फर्क नहीं पड़ता कि हर बार xmlns संदर्भ विशेषता जोड़ती है। यह ब्लैक बॉक्सिंग डाउनस्ट्रीम कुछ तोड़ रहा था।

अंततः मुझे ऐसा कुछ करने के द्वारा मिल गया।

XmlNode newNode = newDoc.SelectSingleNode(xpathQuery, manager); 
newNode.Attributes.RemoveAll(); 
node.ParentNode.InsertAfter(node.OwnerDocument.ImportNode(newNode, true), node); 
संबंधित मुद्दे