在PHP中动态创建和更新.xsd架构?

时间:2013-06-27 19:32:04

标签: php xml xsd simplexml xml-namespaces

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

以下是架构示例(.xsd)

是否有更容易的工具或库?我在php中看到很多xml实用程序,比如SimpleXML,但在我看到的示例中,他们已经有了.xsd文件,并且正在基于给定的模式解析和创建xml文档中的对象和设置值。我想通过PHP以编程方式更改和更新架构.xsd文件?任何提示?或图书馆或appraoches将不胜感激。我即将以一种不太理想的方式开始编写代码(但它会起作用),它每次只重建整个.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">';

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

1 个答案:

答案 0 :(得分:2)

我原本在问题上不够清楚,所以我会自己澄清并回答。我最初在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');