我有一个.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并以面向对象的方式设置新元素的任何建议都会很棒!!!!
答案 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');