XmlSerialiserに名前空間を無視するように指示する方法についてのあなたの質問に対する回答ではなく、回避策です。 xsltトランスフォームを使用して、XMLから名前空間を取り除いてから直列化することができます。
このためのヘルパーとして
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/|comment()|processing-instruction()">
<xsl:copy>
<xsl:apply-templates/>
</xsl:copy>
</xsl:template>
<xsl:template match="*">
<xsl:element name="{local-name()}">
<xsl:apply-templates select="@*|node()"/>
</xsl:element>
</xsl:template>
<xsl:template match="@*">
<xsl:attribute name="{local-name()}">
<xsl:value-of select="."/>
</xsl:attribute>
</xsl:template>
</xsl:stylesheet>
拡張メソッドのカップル、多分それらをすべて取得するには少しトリッキーになるだろうが、私はみます:
/// <summary>
/// Transforms the xmldocument to remove all namespaces using xslt
/// http://stackoverflow.com/questions/987135/how-to-remove-all-namespaces-from-xml-with-c
/// http://msdn.microsoft.com/en-us/library/42d26t30.aspx
/// </summary>
/// <param name="xmlDocument"></param>
/// <param name="indent"></param>
public static XmlDocument RemoveXmlNameSpaces(this XmlDocument xmlDocument, bool indent = true)
{
return xmlDocument.ApplyXsltTransform(Properties.Resources.RemoveNamespaces, indent);
}
public static XmlDocument ApplyXsltTransform(this XmlDocument xmlDocument, string xsltString,bool indent= true)
{
var xslCompiledTransform = new XslCompiledTransform();
Encoding encoding;
if (xmlDocument.GetEncoding() == null)
{
encoding = DefaultEncoding;
}
else
{
encoding = Encoding.GetEncoding(xmlDocument.GetXmlDeclaration().Encoding);
}
using (var xmlTextReader = xsltString.GetXmlTextReader())
{
xslCompiledTransform.Load(xmlTextReader);
}
XPathDocument xPathDocument = null;
using (XmlTextReader xmlTextReader = xmlDocument.OuterXml.GetXmlTextReader())
{
xPathDocument = new XPathDocument(xmlTextReader);
}
using (var memoryStream = new MemoryStream())
{
using (XmlWriter xmlWriter = XmlWriter.Create(memoryStream, new XmlWriterSettings()
{
Encoding = encoding,
Indent = indent
}))
{
xslCompiledTransform.Transform(xPathDocument, xmlWriter);
}
memoryStream.Position = 0;
using (var streamReader = new StreamReader(memoryStream, encoding))
{
string readToEnd = streamReader.ReadToEnd();
return readToEnd.ToXmlDocument();
}
}
}
public static Encoding GetEncoding(this XmlDocument xmlDocument)
{
XmlDeclaration xmlDeclaration = xmlDocument.GetXmlDeclaration();
if (xmlDeclaration == null)
return null;
return Encoding.GetEncoding(xmlDeclaration.Encoding);
}
public static XmlDeclaration GetXmlDeclaration(this XmlDocument xmlDocument)
{
XmlDeclaration xmlDeclaration = null;
if (xmlDocument.HasChildNodes)
xmlDeclaration = xmlDocument.FirstChild as XmlDeclaration;
return xmlDeclaration;
}
public static XmlTextReader GetXmlTextReader(this string xml)
{
return new XmlTextReader(new StringReader(xml));
}
XmlSerializerに渡すことができるように名前空間を取得するためにまずXMLを読み込むことを検討しましたか? –
@StevenDoggartはい、私はしましたが、私はそれを回避する前にこれを行うためのより適切な方法があるかどうかを知りたいと思います。例外が発生することなく名前空間を無視できないことはばかげている:S – user1698428
はい、非常に良い質問であり、答えがあるかどうかは非常に不思議です。 –