1

我不确定这是否重要,但我正在使用 BizTalk 2009 来生成 XML。

有没有办法在我的 XML 模式中指定生成的 XML 实例应该使用目标命名空间作为默认命名空间?

如果我有这样的 xsd 文件:

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
           targetNamespace="http://example.com/">
  <xs:element name="example">
    <xs:complexType>
      <xs:attribute name="value" type="xs:string" /> 
    </xs:complexType>
  </xs:element>
</xs:schema>

它创建一个像这样的 XML 文件:

<ns0:example value="something" xmlns:ns0="http://example.com/" />

但我希望它创建一个这样的 XML 文件:

<example value="something" xmlns="http://example.com/" />

我知道它们在技术上是等效的,但是消费者(供应商 API)的实现很差,我想给他们他们期望的东西。

4

4 回答 4

1

我希望它取决于生成实例的软件,而不是模式。XSD Schema 是为根据模式验证 XML 实例而开发的,而不是为了从中生成实例。所以它不太可能显式地出现在 XMLSchema 中。然而,生成工具可能会利用元素是(不)合格的这一事实

elementFormDefault="(un)qualified" 

触发前缀。

范围不完全,但对于架构设计,以下内容值得一读:http ://www.xfront.com/HideVersusExpose.html

于 2010-12-29T22:41:57.220 回答
1

一种方法是定义没有命名空间的模式。将 BizTalk 架构映射到没有命名空间的新定义架构。从 BizTalk 的角度来看,您将拥有一个表示与消费者的实际合同的模式。(即没有命名空间)此外,BizTalk 使用命名空间#rootnodename 来定义消息类型。在此示例中,您将有两个模式

  1. somenamespace#somerootnodename
  2. #somerootnodename

这种方法的可能缺点是这会将这个架构 (#rootnodename) 的使用限制为 BizTalk 组的 1 个实例。

于 2010-12-30T14:10:27.503 回答
1

这是 BizTalk 使用此 XML 架构的默认行为,据我所知,没有内置的方法可以更改它。

但是,您真正想要的是出站消息符合比 BizTalk 使用的更干净、更自由的格式。为此,您可以使用自定义管道组件(和自定义发送管道)在传出消息离开 BizTalk 之前对其进行处理。

想法是更改命名空间前缀作为在 BizTalk 外部发送消息的一部分。转换发生在发送管道的处理过程中。

Nic Barden已经在博客中提供了一些关于此的源代码。您可以使用他的示例作为执行命名空间前缀替换的基础,而不是替换命名空间本身。

我强烈建议您查看他撰写的有关开发流式管道组件的整个系列文章。Nic 对编写健壮的企业级管道组件所需的一切进行了广泛而透彻的描述。

于 2011-01-03T11:18:58.863 回答
0

ns0每当 BizTalk btm 映射消息时都会添加前缀。没关系,因为仍然是有效的 xml,但是当使用旧的或不完整的 xml 解析器向合作伙伴发送消息时,这可能是一个问题。

您可以删除ns0前缀,而是ns0通过将 btm 从可视地图更改为地图来.xslt输出消息上创建默认命名空间。

例如,一旦您将地图转换为 xslt,请将 xslt 从以下位置更改:

<?xml version="1.0" encoding="utf-16"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                xmlns:msxsl="urn:schemas-microsoft-com:xslt"
                exclude-result-prefixes="msxsl s0"
                version="1.0"
                xmlns:ns0="http://targetns"
                xmlns:s0="http://sourcens"
                xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <xsl:output omit-xml-declaration="yes" method="xml" version="1.0" />
  <xsl:template match="/">
    <xsl:apply-templates select="s0:FromRoot" />
  </xsl:template>
  <xsl:template match="s0:FromRoot">
    <ns0:ToRoot>
      <xsl:for-each select="s0:FromElement">
        <ns0:ToElement>
          <xsl:value-of select="text()"/>
        </ns0:ToElement>
      </xsl:for-each>
    </ns0:ToRoot>
  </xsl:template>
</xsl:stylesheet>

至:

<?xml version="1.0" encoding="utf-16"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                xmlns:msxsl="urn:schemas-microsoft-com:xslt"
                xmlns:var="http://schemas.microsoft.com/BizTalk/2003/var"
                exclude-result-prefixes="msxsl s0"
                version="1.0"
                xmlns="http://targetns"
                xmlns:s0="http://sourcens"
                xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <xsl:output omit-xml-declaration="yes" method="xml" version="1.0" />
  <xsl:template match="/">
    <xsl:apply-templates select="s0:FromRoot" />
  </xsl:template>
  <xsl:template match="s0:FromRoot">
    <ToRoot>
      <xsl:for-each select="s0:FromElement">
        <ToElement>
          <xsl:value-of select="text()"/>
        </ToElement>
      </xsl:for-each>
    </ToRoot>
  </xsl:template>
</xsl:stylesheet>

即更改默认xmlns,然后自动删除ns0 前缀。

更通用的解决方案也是可能的(例如,类似于 Firras 的答案 here),这可能很有用,例如放置为发送端口映射以从元素中去除所有前缀。但是,如果输出消息中有多个 xmlns,则需要小心!

于 2012-09-01T07:36:09.337 回答