[英]C#: How to remove namespace information from XML elements
如何从C#中的每个XML元素中删除“xmlns:...”命名空间信息?
虽然Zombiesheep的警示性答案,我的解决方案是使用xslt转换来清洗xml来执行此操作。
wash.xsl:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="no" encoding="UTF-8"/>
<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>
从这里http://simoncropp.com/working-around-xml-namespaces
var xDocument = XDocument.Parse(
@"<root>
<f:table xmlns:f=""http://www.w3schools.com/furniture"">
<f:name>African Coffee Table</f:name>
<f:width>80</f:width>
<f:length>120</f:length>
</f:table>
</root>");
xDocument.StripNamespace();
var tables = xDocument.Descendants("table");
public static class XmlExtensions
{
public static void StripNamespace(this XDocument document)
{
if (document.Root == null)
{
return;
}
foreach (var element in document.Root.DescendantsAndSelf())
{
element.Name = element.Name.LocalName;
element.ReplaceAttributes(GetAttributes(element));
}
}
static IEnumerable GetAttributes(XElement xElement)
{
return xElement.Attributes()
.Where(x => !x.IsNamespaceDeclaration)
.Select(x => new XAttribute(x.Name.LocalName, x.Value));
}
}
我遇到了类似的问题(需要从特定元素中删除命名空间属性,然后将XML作为XmlDocument
返回到BizTalk),但这是一个奇怪的解决方案。
在将XML字符串加载到XmlDocument
对象之前,我进行了文本替换以删除有问题的命名空间属性。 最初看起来有点错误,因为我最终得到了无法通过Visual Studio中的“XML Visualizer”解析的XML。 这是最初让我摆脱这种方法的原因。
但是,文本仍然可以加载到XmlDocument
,我可以将它输出到BizTalk罚款。
还要注意,之前我在尝试使用childNode.Attributes.RemoveAll()
删除命名空间属性时遇到了一条死胡同 - 它又回来了!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.