【问题标题】:Change name of all elements in XML <element> to <ns2:element>将 XML <element> 中所有元素的名称更改为 <ns2:element>
【发布时间】:2015-12-08 17:29:18
【问题描述】:

我从 web 服务获取 XML,如下所示:

<CLASSXml>
    <CalculationIndex>
        <RunDesc>NormalCalc</RunDesc>
    </CalculationIndex>
    <GlobalData>
        <CalcIdent>
            <CalcUId>CLASS:20151203:19335012:000000000000:203:CS:CZK:349074</CalcUId>
            <CalcNo>2454307111</CalcNo>
            <CustomNo>349074</CustomNo>
            <CalcVer>2300</CalcVer>
            <XMLVer>23.00.01</XMLVer>
            <ClassBuild>23.00.04.03</ClassBuild>
            <SAXIFVersion>6.2</SAXIFVersion>

(实际情况要长得多)

因此,通常它位于具有多个子元素和子元素的父元素上。

我需要更改此 XML 中每个元素的名称,例如 &lt;CalculationIndex&gt;&lt;RunDesc&gt;&lt;CLASSXml&gt; 等等,并在它之前添加 ns2: 所以在这种情况下为 &lt;ns2:CalculationIndex&gt;&lt;ns2:RunDesc&gt;&lt;ns2:CLASSXml&gt;

有没有办法通过在它之前添加一些字符串来获取整个 XML 并在 之间编辑每个部分的名称?

【问题讨论】:

  • 有什么理由不简单地为根标签设置默认命名空间?类似于:xmlns="xml.example.com/ns/library"
  • 为什么不在根元素上声明命名空间? (假设它是针对整个文件的)元素的命名空间前缀是任意的。
  • 我得到的 XML 来自 web 服务,我无权访问来自那里的更改数据。 @SamuelÅslund 你的建议看起来很聪明,你能提供一些示例代码吗?
  • w3schools.com/xml/xml_namespaces.asp 我听说它们并不总是 100% 准确,但大多数时候它们对我来说已经足够好了。

标签: xml


【解决方案1】:

一个简单的解决方案是使用str_replace 来更改所需的元素:

$xml = str_replace('<CalculationIndex>', '<ns2:CalculationIndex>', $xml);
$xml = str_replace('</CalculationIndex>', '</ns2:CalculationIndex>', $xml);
// etc.

编辑:或者如果有很多元素,你可以使用正则表达式:

$xml = preg_replace('/<(.+)>/', '<ns2:$1>', $xml);
$xml = preg_replace('/<\/(.+)>/', '</ns2:$1>', $xml);

【讨论】:

  • 嘿@this。 lau 我同意这很简单并且可能会有所帮助,但这只会改变我指定的元素,我有办法为所有这些元素做这件事吗?
  • @Andurit,您可以使用正则表达式(请参阅更新的答案)。
  • 上述文本替换建议并非适用于所有情况;特别是它不处理元素的属性。如果将 XML 作为原始文本处理,则需要谨慎对待。我建议将任何 XML 更改处理为 XML。
  • @Paul,是的,这取决于他的用例。如果它看起来像他发布的 XML,那么这个解决方案就可以了。如果它更复杂,那么正确解析它可能确实更好。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-12
  • 1970-01-01
  • 2019-05-17
  • 1970-01-01
  • 1970-01-01
  • 2012-05-12
相关资源
最近更新 更多