ج#:كيفية إزالة معلومات مساحة الاسم من عناصر XML

StackOverflow https://stackoverflow.com/questions/413050

  •  03-07-2019
  •  | 
  •  

سؤال

كيف يمكنني إزالة معلومات مساحة الاسم "xmlns:..." من كل عنصر XML في C#؟

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

المحلول

على الرغم من إجابة Zombiesheep التحذيرية، فإن الحل الذي أقدمه هو غسل ملف XML باستخدام تحويل xslt للقيام بذلك.

غسل.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، لقد فعلت ذلك لاستبدال نص لإزالة السمة المخالف مساحة الاسم. وبدا الخطأ في البداية كما انتهى بي الأمر مع XML التي لا يمكن تحليل من قبل "XML متخيل" في Visual Studio. هذا ما وضعني في البداية من هذا النهج.

ومع ذلك، لا يزال من الممكن تحميل النص في XmlDocument وأنا لا يمكن إخراجه إلى BizTalk على ما يرام.

ملاحظة ذلك أيضا في وقت سابق، أنا ضربت مسدود واحدة عند محاولة استخدام childNode.Attributes.RemoveAll() لإزالة سمة مساحة الاسم - أنه عاد لتوه من جديد

!
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top