以下xml片段有什么区别?
我问的原因是,当我将xml提交给BPEL流程时,第一个和第二个工作,但最后一个不工作,发生了什么?
<!-- imported namespace referenced with prefix -->
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:fxd="http://aaa.yy.zz/Foo">
<soap:Body>
<fxd:GSR>
<aaa>
<a>1000000</a>
<c>UUU</c>
<cp>ZZ</cp>
</aaa>
<bbb>
<cc>CCC</cc>
<v>110005632501</v>
</bbb>
<adate>2009-11-04T07:14:44.5814828+02:00</adate>
<bdate>2009-11-04T07:14:44.5814828+02:00</bdate>
<m>NNNN</m>
<p>SSSS</p>
<r>LLLL</r>
</fxd:GSR>
</soap:Body>
</soap:Envelope>
<!-- inline imported namespace referenced with a prefix-->
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<soap:Body>
<fxd:GSR xmlns:fxd="http://aaa.yy.zz/Foo">
<aaa>
<a>1000000</a>
<c>UUU</c>
<cp>ZZ</cp>
</aaa>
<bbb>
<cc>CCC</cc>
<v>110005632501</v>
</bbb>
<adate>2009-11-04T07:14:44.5814828+02:00</adate>
<bdate>2009-11-04T07:14:44.5814828+02:00</bdate>
<m>NNNN</m>
<p>SSSS</p>
<r>LLLL</r>
</fxd:GSR>
</soap:Body>
</soap:Envelope>
<!-- inline namespace -->
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<soap:Body>
<GSR xmlns="http://aaa.yy.zz/Foo">
<aaa>
<a>1000000</a>
<c>UUU</c>
<cp>ZZ</cp>
</aaa>
<bbb>
<cc>CCC</cc>
<v>110005632501</v>
</bbb>
<adate>2009-11-04T07:14:44.5814828+02:00</adate>
<bdate>2009-11-04T07:14:44.5814828+02:00</bdate>
<m>NNNN</m>
<p>SSSS</p>
<r>LLLL</r>
</GSR>
</soap:Body>
</soap:Envelope>
我的直觉说它们是xml的等价片段,特别是考虑到它们来自同一个wsdl。它们被成功解析,但元素的名称空间不是它们应该的。
答案 0 :(得分:2)
他们不相等。也就是说,示例1和2相等,但不是3。
与<fxd:GSR>
形成鲜明对比,请<GSR>
。你看,第一个是前缀。现在,如果定义名称空间xmlns:fxd=""
,则在此名称空间中设置所有同等前缀的元素。所有其他(包括根本没有任何前缀的元素)不在此命名空间。
然后,在第三个示例中,为所有未加前缀的元素定义命名空间。这导致了这样一个事实,即GSR的无谓儿童突然与他们的祖先在同一名称空间,而不是 null
名称空间他们之前在1和2中。
编辑:只是一个小小的澄清:
xmlns:fxd="http://aaa.yy.zz/Foo"
对于以'fxd:'开头的所有元素,将名称空间设置为“http://aaa.yy.zz/Foo”。
xmlns="http://aaa.yy.zz/Foo"
将所有元素的名称空间设置为“http://aaa.yy.zz/Foo”,其名称中包含 no 冒号(=它们不带前缀)。
如果您希望1和2的行为类似于3,只需添加
即可xmlns="http://aaa.yy.zz/Foo"
在第一个未加前缀的元素出现之前的某个地方。如果你想要反过来,那么你必须在所有没有命名空间的元素前面添加前缀,例如'bar:'并将其添加到某处:
xmlns:bar=""
因此在null命名空间中显式设置它们(就像它们在前两个例子中一样)。
答案 1 :(得分:0)
在上一个示例中,是否将所有元素都包含在fxd命名空间中的GSR元素中?在前2个样本中,GSR元素中包含的元素不在fxd名称空间中。
所以,我想说最后一个样本与前两个样本不同。