首页 > 解决方案 > 从 XML 文件中删除 xmlns 命名空间

问题描述

我想xmlns从文件中删除第一个属性,XML因为它给我的XSL转换带来了一些麻烦。

这是原始的 xml :

<ns4:ExportReferences xmlns="urn:be:fgov:ehealth:samws:v2:refdata" xmlns:ns2="urn:be:fgov:ehealth:samws:v2:core" xmlns:ns3="urn:be:fgov:ehealth:samws:v2:consultation" xmlns:ns4="urn:be:fgov:ehealth:samws:v2:export">
  <AtcClassification code="A">
    <Description>Alimentary Tract and Metabolism</Description>
  </AtcClassification>
  <AtcClassification code="A01">
    <Description>Stomatological Preparations</Description>
  </AtcClassification>
</ns4:ExportReferences>

我首先尝试使用Regex: Regex.IsMatch(xml, @"xmlns=(.*?)")给我一个真实的但Regex.Replace(xml, pattern, "")不起作用。

然后我尝试删除它:

XDocument doc = XDocument.Load(@"file.xml");
foreach (var attr in doc.Descendants().Attributes()){
  if (attr.Name == "xmlns")
    attr.Remove();}

还有很多其他尝试,但我总是有我不理解的相同行为:我可以删除第一个xmlns属性,但是当我保存文件时,它现在出现在每个元素中:

<ns4:ExportReferences xmlns="urn:be:fgov:ehealth:samws:v2:refdata" xmlns:ns2="urn:be:fgov:ehealth:samws:v2:core" xmlns:ns3="urn:be:fgov:ehealth:samws:v2:consultation" xmlns:ns4="urn:be:fgov:ehealth:samws:v2:export">
  <AtcClassification code="A" xmlns="urn:be:fgov:ehealth:samws:v2:refdata">
    <Description>Alimentary Tract and Metabolism</Description>
  </AtcClassification>
  <AtcClassification code="A01" xmlns="urn:be:fgov:ehealth:samws:v2:refdata">
    <Description>Stomatological Preparations</Description>
  </AtcClassification>
</ns4:ExportReferences>

如果我保存它并再次尝试:

foreach (var attr in doc.Descendants().Attributes()){
  if (attr.NextAttribute != null && attr.NextAttribute.Name == "xmlns")
    attr.NextAttribute.Remove();}

它也将其删除,但重新打开文件时未进行任何更改。

任何帮助将不胜感激。

编辑提供更多信息

  1. 输入 XML:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ns4:ExportReferences xmlns="urn:be:fgov:ehealth:samws:v2:refdata" xmlns:ns2="urn:be:fgov:ehealth:samws:v2:core" xmlns:ns3="urn:be:fgov:ehealth:samws:v2:consultation" xmlns:ns4="urn:be:fgov:ehealth:samws:v2:export" xmlns:ns5="urn:be:fgov:ehealth:samws:v2:actual:common" xmlns:ns6="urn:be:fgov:ehealth:samws:v2:company:submit" xmlns:ns7="urn:be:fgov:ehealth:samws:v2:reimbursement:submit" xmlns:ns8="urn:be:fgov:ehealth:samws:v2:reimbursementlaw:submit" xmlns:ns9="urn:be:fgov:ehealth:samws:v2:virtual:common" xmlns:ns10="urn:be:fgov:ehealth:samws:v2:compounding:common" xmlns:ns11="urn:be:fgov:ehealth:samws:v2:nonmedicinal:common" xmlns:ns12="urn:be:fgov:ehealth:samws:v2:chapteriv:submit" xmlns:ns13="urn:be:fgov:ehealth:samws:v2:actual:status" version="5.0" SamId="E.20201119_141847">
    <AtcClassification code="A">
        <Description>Alimentary Tract and Metabolism</Description>
    </AtcClassification>
    <AtcClassification code="A01">
        <Description>Stomatological Preparations</Description>
    </AtcClassification>
    <AtcClassification code="A01A">
        <Description>Stomatological Preparations</Description>
    </AtcClassification>
    <AtcClassification code="A01AA">
        <Description>Caries Prophylactic Agents</Description>
    </AtcClassification>
    <AtcClassification code="A01AA01">
        <Description>Sodium Fluoride</Description>
    </AtcClassification>
    <AtcClassification code="A01AA02">
        <Description>Sodium Monofluorophosphate</Description>
    </AtcClassification>
</ns4:ExportReferences>
  1. XSLT:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:ns2="urn:be:fgov:ehealth:samws:v2:core"
xmlns:ns3="urn:be:fgov:ehealth:samws:v2:consultation"
xmlns:ns4="urn:be:fgov:ehealth:samws:v2:export"
xmlns:ns5="urn:be:fgov:ehealth:samws:v2:actual:common"
xmlns:ns6="urn:be:fgov:ehealth:samws:v2:company:submit"
xmlns:ns7="urn:be:fgov:ehealth:samws:v2:reimbursement:submit"
xmlns:ns8="urn:be:fgov:ehealth:samws:v2:reimbursementlaw:submit"
xmlns:ns9="urn:be:fgov:ehealth:samws:v2:virtual:common"
xmlns:ns10="urn:be:fgov:ehealth:samws:v2:compounding:common"
xmlns:ns11="urn:be:fgov:ehealth:samws:v2:nonmedicinal:common"
xmlns:ns12="urn:be:fgov:ehealth:samws:v2:chapteriv:submit"
xmlns:ns13="urn:be:fgov:ehealth:samws:v2:actual:status">
<xsl:template match="/ns4:ExportReferences">
  <xsl:for-each select="AtcClassification">
    <xsl:text>INSERT INTO ATC VALUES ('</xsl:text>
      <xsl:value-of select="@code" />
      <xsl:text>','</xsl:text>
        <xsl:value-of select="Description" />
      <xsl:text>');</xsl:text>
    </xsl:for-each>
  </xsl:template>
</xsl:stylesheet>
  1. 期望的输出:
INSERT INTO ATC VALUES ('A','Alimentary Tract and Metabolism');INSERT INTO ATC VALUES ('A01','Stomatological Preparations');INSERT INTO ATC VALUES ('A01A','Stomatological Preparations');INSERT INTO ATC VALUES ('A01AA','Caries Prophylactic Agents');INSERT INTO ATC VALUES ('A01AA01','Sodium Fluoride');INSERT INTO ATC VALUES ('A01AA02','Sodium Monofluorophosphate');
  1. XSLT 处理器及其版本:

xsl:vendor= 微软 xsl:version= 1

标签: c#xmlxml-namespaces

解决方案


因此,您只需将该名称空间也添加到您的 XSL 中:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:ns2="urn:be:fgov:ehealth:samws:v2:core"
xmlns:ns3="urn:be:fgov:ehealth:samws:v2:consultation"
xmlns:ns4="urn:be:fgov:ehealth:samws:v2:export"
xmlns:ns5="urn:be:fgov:ehealth:samws:v2:actual:common"
xmlns:ns6="urn:be:fgov:ehealth:samws:v2:company:submit"
xmlns:ns7="urn:be:fgov:ehealth:samws:v2:reimbursement:submit"
xmlns:ns8="urn:be:fgov:ehealth:samws:v2:reimbursementlaw:submit"
xmlns:ns9="urn:be:fgov:ehealth:samws:v2:virtual:common"
xmlns:ns10="urn:be:fgov:ehealth:samws:v2:compounding:common"
xmlns:ns11="urn:be:fgov:ehealth:samws:v2:nonmedicinal:common"
xmlns:ns12="urn:be:fgov:ehealth:samws:v2:chapteriv:submit"
xmlns:ns13="urn:be:fgov:ehealth:samws:v2:actual:status"

xmlns:something="urn:be:fgov:ehealth:samws:v2:refdata">

<xsl:template match="/ns4:ExportReferences">

  <xsl:for-each select="something:AtcClassification">

    <xsl:text>INSERT INTO ATC VALUES ('</xsl:text>
      <xsl:value-of select="@code" />
      <xsl:text>','</xsl:text>

        <xsl:value-of select="something:Description" />

      <xsl:text>');</xsl:text>
    </xsl:for-each>
  </xsl:template>
</xsl:stylesheet>

注意:该ActClassification元素,因为它在 XML 中没有前缀,所以在默认命名空间中。由于它位于另一个元素中,该元素将默认命名空间声明为urn:be:fgov:ehealth:samws:v2:refdata,所以它就是这样。

另请注意,名称空间前缀具有本地含义。您无需ns2在转换中使用,因为 XML 文件使用ns2; 重要/需要匹配的是骨灰盒。所以在这里我urn:be:fgov:ehealth:samws:v2:refdata使用了前缀something


推荐阅读