【发布时间】: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