在PHP中获取XML模式值

时间:2018-08-23 08:36:32

标签: php xml

我刚接触XML,今天已经被困了将近一个星期。

据我了解,我有一个XML文件,其中包含架构和xml元素。我试图获取在架构中定义的值并使用它们,我也想知道如何加入xml元素,就像我在mysql或sql中那样说join table a with table b where a.id=b.a_id,但在这种情况下使用xml元素。

这是我的结构:

和Product对象如下:

`<xs:element name="ProductImage">
        <xs:complexType>
          <xs:sequence>
            <xs:element name="ProductBaseCode" default="">
              <xs:simpleType>
                <xs:restriction base="xs:string">
                  <xs:maxLength value="15" />
                </xs:restriction>
              </xs:simpleType>
            </xs:element>
            <xs:element name="ImageName">
              <xs:simpleType>
                <xs:restriction base="xs:string">
                  <xs:maxLength value="255" />
                </xs:restriction>
              </xs:simpleType>
            </xs:element>
            <xs:element name="IsDefaultImage" type="xs:boolean" />
            <xs:element name="ImageWidth" type="xs:int" />
            <xs:element name="ImageHeight" type="xs:int" />
            <xs:element name="ImageUrl">
              <xs:simpleType>
                <xs:restriction base="xs:string">
                  <xs:maxLength value="255" />
                </xs:restriction>
              </xs:simpleType>
            </xs:element>
          </xs:sequence>
        </xs:complexType>
</xs:element>

<Product>
    <Name>Pad Printing</Name>
    <Description>Pad Printing</Description>
    <Price>0.8</Price>
    <Flags>1</Flags>
    <BaseItemCode>PA</BaseItemCode>
    <Id>1b9d8241-61c8-47cd-baf5-d9258cbc4734</Id>
    <ColourName/>
</Product>

`

我需要使用ImageURL中的BaseItemCode的{​​{1}}在相关产品的ProductImage中获取ProductBaseCode

2 个答案:

答案 0 :(得分:0)

如果您想读取XML中的数据,则可以使用simplexml_load_string。

您可以这样做:

    $xml = "<xs:element name="ProductImage">
        <xs:complexType>
          <xs:sequence>
            <xs:element name="ProductBaseCode" default="">
              <xs:simpleType>
                <xs:restriction base="xs:string">
                  <xs:maxLength value="15" />
                </xs:restriction>
              </xs:simpleType>
            </xs:element>
            <xs:element name="ImageName">
              <xs:simpleType>
                <xs:restriction base="xs:string">
                  <xs:maxLength value="255" />
                </xs:restriction>
              </xs:simpleType>
            </xs:element>
            <xs:element name="IsDefaultImage" type="xs:boolean" />
            <xs:element name="ImageWidth" type="xs:int" />
            <xs:element name="ImageHeight" type="xs:int" />
            <xs:element name="ImageUrl">
              <xs:simpleType>
                <xs:restriction base="xs:string">
                  <xs:maxLength value="255" />
                </xs:restriction>
              </xs:simpleType>
            </xs:element>
          </xs:sequence>
        </xs:complexType>
</xs:element>

<Product>
    <Name>Pad Printing</Name>
    <Description>Pad Printing</Description>
    <Price>0.8</Price>
    <Flags>1</Flags>
    <BaseItemCode>PA</BaseItemCode>
    <Id>1b9d8241-61c8-47cd-baf5-d9258cbc4734</Id>
    <ColourName/>
</Product>"

$xmlData = simplexml_load_string($xml);

$imageurl = $xmldata['xs:element']['xs:element'][5]['@attributes']['name'];

因此,基本上,您将XML制成一个对象,然后转到要从中获取一些数据的对象中的位置。

如果不确定对象的结构如何,则始终可以打印对象。

答案 1 :(得分:0)

将模式嵌入实例文档中是很不寻常的。我认为您不需要它,我认为最好不要理会它。

让我感到困惑的是,您已经显示了ProductImage元素的架构,但是没有显示实际的ProductImage元素。它们是与Product元素位于同一文档中还是其他地方?

在PHP世界中,执行您描述的那种联接查询的最简单方法可能是使用XSLT。有一个内置的本地XSLT 1.0处理器,或者您可以安装Saxon / C,它具有一个PHP接口,可为您提供XSLT 3.0。它还为您提供XQuery,如果您是用SQL术语思考问题的人,则可能会感到更满意。我无法提供任何实际的XQuery代码来反映您的查询,因为我看不到数据来自何处。