سؤال

لذلك أنا لا تزال طرح أسئلة حول هذا الموضوع :-(

حتى أنا إنشاء كائن ، تزيينها Xml التسلسل الصفات ، من ما شاهدته إضافة فارغة مساحة اسم xml التسلسل namepsace مجموعات حتى لا تحصل زائدة سمات لم أكن أنوي أن يكون.

تحرير: السمة أعني هي هذه:

<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="" السمة في رابط tags.هذا شيء عظيم ولكن أنا لا تتطلب أن العنصر الجذر يكون 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.

أي مساعدة هي موضع تقدير كبير.

هل كانت مفيدة؟

المحلول

يعمل هذا (أنت فقط بحاجة إلى أن تكون في نفس مساحة الاسم واستخدام مساحات الدرجة حتى 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>

نصائح أخرى

كنت أعاني من مشكلة إدراج عقدة في القائمة الوثيقة مع العديد من الأسماء.

بغض النظر عن ما كنت تعيين مساحة إلى أنه سيكون إضافة xmlns سمة مرجع في كل مرة بغض النظر عن ما.هذا وقد كسر شيء أسود محاصر المصب.

وأخيرا حصلت حول هذا عن طريق القيام بشيء من هذا القبيل.

XmlNode newNode = newDoc.SelectSingleNode(xpathQuery, manager);
newNode.Attributes.RemoveAll();   
node.ParentNode.InsertAfter(node.OwnerDocument.ImportNode(newNode, true), node);

هل حاولت عدم تحديد مساحة في XmlRoot الخاصية ؟

I. e.:

[XmlRoot(ElementName = "url")]
public class SitemapNode
{ 
...
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top