我有一个.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');