空のxmlns =“”を削除しますXmlシリアル化後
-
03-07-2019 - |
質問
だから私はまだこのトピックについて質問しています:-(
オブジェクトを作成し、Xmlシリアル化属性で装飾します。これまで見てきたことから、空の名前空間をxmlシリアル化namepsaceコレクションに追加して、不要な属性を取得しないようにしました。
編集:私が意味する属性は次のとおりです:
<url xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"; xmlns:xsd="http://www.w3.org/2001/XMLSchema"; xmlns="">
そのため、2つの追加属性が与えられます。
さらに調査した後、ドキュメントの先頭を次のように変更した場合:**
writer.WriteStartElement("urlset","http://www.sitemaps.org/schemas/sitemap/0.9");
to
writer.WriteStartElement("urlset");
**空のxmlns =&quot;&quot;が表示されません。 urlタグの属性。これは素晴らしいですが、ルート要素に xmlns =&quot; http://www.sitemaps.org/schemas/sitemap/0.9"
が必要です。つまり:
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
しかし、シリアル化された型で空の xmlns =&quot;&quot;
属性を取得しています。
[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);
}
これは、空のxmlns =&quot;&quot;が残っていることを除いて、問題なく動作します。このように
<url xmlns="">
アイデアはありますか?繰り返しますが、XmlTextWriterとXmlDocumentを使用してこれを実現できますが、XmlWriterを使用して実現する必要があります。
ご協力ありがとうございます。
解決
これは機能します(同じ名前空間にいる必要があり、名前空間クラスを使用して、作成者が混乱しないようにします):
[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属性で名前空間を指定しないようにしましたか?
つまり:
[XmlRoot(ElementName = "url")]
public class SitemapNode
{
...
}