【问题标题】:Dynamically create and update an .xsd schema in PHP?在 PHP 中动态创建和更新 .xsd 架构?
【发布时间】:2013-06-25 11:02:14
【问题描述】:

我有一个定义简单和复杂类型的 .xsd 架构 - 下面是一个示例。我需要能够加载这个 .xsd 文件,向其中添加更多元素并将其作为字符串返回(最终将通过 api 发送到第 3 方服务)。该网站是基于 Drupal 构建的,因此代码需要在 PHP 中。

以下是架构示例 (.xsd)

是否有任何工具或库可以让您更轻松?我在 php 中看到了很多 xml 实用程序,例如 SimpleXML,但在我查看的示例中,它们已经具有 .xsd 文件,并且正在基于给定模式在 xml 文档中解析和创建对象和设置值。我想通过 php 以编程方式更改和更新架构 .xsd 文件?有什么提示吗?或图书馆或方法将不胜感激。我即将开始以一种不太理想的方式编写代码(但它会起作用),它每次都会重建整个 .xsd 并且有多个循环使用字符串来添加新元素,但这不是最好的解决方案。 我希望有一个工具可以像这样工作:

$newschemaObject = MakeDynmaicObject(oldschema.xsd);
$newschema->add(simple, text, "New Text Field", required);
$stringtosend = $newschema->buildXSD();

schema.xsd 示例

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
 <xsd:element name="metadata">
    <xsd:complexType>
  <xsd:sequence>
    <xsd:element name="DrupalEntityId" minOccurs="0" maxOccurs="1" type="textType">
      <xsd:annotation>
        <xsd:documentation/>
        <xsd:appinfo>
          <label>Drupal Entity ID</label>
          <key>Drupal Entity ID</key>
          <searchable>true</searchable>
          <timeControl>false</timeControl>
          <description/>
        </xsd:appinfo>
      </xsd:annotation>
    </xsd:element>
    <xsd:element id="md_631560E7-14AD-5327-732B-8268813A0553" name="SampleMultiValueTextField" minOccurs="0" maxOccurs="unbounded" type="textType">
      <xsd:annotation>
        <xsd:documentation/>
        <xsd:appinfo>
          <label>Sample Multi Value Text Field</label>
          <key>Sample Multi Value Text Field</key>
          <searchable>true</searchable>
          <timeControl>false</timeControl>
          <description>This is a sample multivalue text field</description>
        </xsd:appinfo>
      </xsd:annotation>
    </xsd:element>
 ...
</xsd:schema>

我的代码的当前版本使用了很多这样的字符串:

$xsd .= '<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">';
$xsd .= '  <xsd:element name="metadata">';

生成上述模式,但它不灵活或非常程序化。任何关于能够以面向对象的方式更新.xsd 和设置新元素的建议都会很棒!!!!

【问题讨论】:

  • Parse XML using a XSD in PHP 的可能重复项
  • 你的问题不清楚。您是否要求使用基于字符串而不是文件名的 validate 方法(是的,这是可能的),或者您是在询问如何修改 XML 文档(是的,这也是可能的)。以目前的形式,您的问题尚不清楚。像 “是否有任何工具或库可以让您更轻松?” 这样的句子无论如何都是一个危险信号。
  • 对不起,我的问题不清楚,我最初不知道正确表达它,但我需要做的是使用 PHP 的 SimpleXML(您也可以使用 XMLWriter)创建一个 .xsd 文件以允许动态添加字段的方式从头开始。我将回答我自己的问题并展示一个代码示例,再次抱歉没有更清楚
  • 所以我猜您主要想知道如何创建带有名称空间的 XML 文档。在您的回答进一步阐明这一点后,我将重新标记您的问题。

标签: php xml xsd simplexml xml-namespaces


【解决方案1】:

我最初的问题不够清楚,所以我会自己澄清并回答。我最初在 PHP 中输​​出一个硬编码字符串以用作 xml .xsd 模式,它不允许动态更改定义以添加新元素或属性。我最终使用 SimpleXML 创建了我的 .xsd 字符串(也可以保存为文件)。

$xmlSchema = new SimpleXMLElement('<xmlns:xsd:schema></xmlns:xsd:schema>', LIBXML_NOERROR, false, 'xsd', true);
$xmlSchema->addAttribute('xmlns:xmlns:xsd', 'http://www.w3.org/2001/XMLSchema');
$newelement = $xmlSchema->addChild('xsd:xsd:element');
$newelement->addAttribute('name', 'metadata');
$newelement = $metaelement->addChild($elmprefix.'complexType');
$sequence = $newelement->addChild($elmprefix.'sequence');

【讨论】:

  • 给定的示例中没有错误,因为 SimpleXMLElement 不喜欢在读取根元素后添加命名空间。使用 SimpleXMLElement('&lt;xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified"&gt;&lt;/xs:schema&gt;'); 不是很好,但无需抑制错误即可工作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-06-03
  • 1970-01-01
  • 2018-11-08
  • 2019-05-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多