在PHP中动态创建和更新.xsd模式



我有一个.xsd模式,它定义了简单类型和复杂类型——下面是一个示例。我需要能够加载这个.xsd文件,向其中添加更多元素,并将其作为字符串返回(最终将通过api发送到第三方服务)。该网站是基于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和设置新元素的建议都将是惊人的!!!!

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

最新更新