当前位置: 首页 > 知识库问答 >
问题:

是否可以在父标记和子标记中编写XMLSchema-instance?

孔弘盛
2023-03-14

我想创建下面的XML,它在“serviceaddrq”中具有xmlns:xsi=“http://www.w3.org/2001/xmlschema-instance”以及“service”标记。那么有没有可能创建这样的XML呢?

必需的XML:

<ServiceAddRQ echoToken="DummyEchoToken" version="2013/12"
  xmlns="http://www.test.com/schemas/2005/06/messages"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.test.com/schemas/2005/06/messages ServiceAddRQ.xsd">  
        <Service xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="ServiceHotel" availToken="1jMqWGjqrx25Bp60gV2Qggb3">
        </Service>
</ServiceAddRQ>

Java生成的XML:在Java生成的代码中,我得到的是“服务”标记的空白XMLN。

<ServiceAddRQ xmlns="http://www.test.com/schemas/2005/06/messages"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" echoToken="6BB6B47EEEF4290515103925"
    version="2013/12"
    xsi:schemaLocation="http://www.test.com/schemas/2005/06/messages HotelValuedAvailRQ.xsd">   
    <Service xmlns="" xsi:type="ServiceHotel" availToken="1/YncBXZJXY17Z/ygNiO7gcg">        
    </Service>
</ServiceAddRQ>

相同的Java代码:

    static private Namespace NSSERVICE = Namespace.getNamespace("http://www.test.com/schemas/2005/06/messages");
    static private Namespace NSSCHEMA = Namespace.getNamespace("xsi", "http://www.w3.org/2001/XMLSchema-instance");

        String sXMLOut = "";
        Element barceloDS_requests= new Element("ServiceAddRQ",NSSERVICE);  
            barceloDS_requests.setAttribute("echoToken",searchParams.getSessionID().substring(0, 12)+GenTools.getSystemDateWithTime3());
            barceloDS_requests.setAttribute("version","2013/12");
            barceloDS_requests.addNamespaceDeclaration(NSSCHEMA);
            barceloDS_requests.setAttribute("schemaLocation", "http://www.test.com/schemas/2005/06/messages HotelValuedAvailRQ.xsd", NSSCHEMA);

         Namespace xsi = Namespace.getNamespace(GenTools.returnEmptyForNull(sXMLNS_XSI), "http://www.w3.org/2001/XMLSchema-instance");
         Element eleService=new Element("Service");
            eleService.setAttribute("type", "ServiceHotel", xsi);
            eleService.setAttribute("availToken",contractInfo[1]);
    barceloDS_requests.addContent(eleService);
    sXMLOut = new GetXMLOutputter().getXMLOutputter(barceloDS_requests,true);

共有1个答案

鞠嘉誉
2023-03-14

序列化程序添加xmlns=“”是正确的,因为您创建了具有默认命名空间声明的顶级元素,但随后添加了不在命名空间中的子元素。要获得所需的输出,您需要创建service元素,其名称空间与根serviceaddrq相同http://www.test.com/schemas/2005/06/messages。像这样多试试:

static private Namespace NSSERVICE = Namespace.getNamespace("http://www.test.com/schemas/2005/06/messages");
static private Namespace NSSCHEMA = Namespace.getNamespace("xsi", "http://www.w3.org/2001/XMLSchema-instance");

String sXMLOut = "";
Element barceloDS_requests= new Element("ServiceAddRQ",NSSERVICE);  
barceloDS_requests.setAttribute("echoToken",searchParams.getSessionID().substring(0, 12)+GenTools.getSystemDateWithTime3());
barceloDS_requests.setAttribute("version","2013/12");
barceloDS_requests.addNamespaceDeclaration(NSSCHEMA);
barceloDS_requests.setAttribute("schemaLocation", "http://www.test.com/schemas/2005/06/messages HotelValuedAvailRQ.xsd", NSSCHEMA);

// --------------
// Key change -- Create Service element in the right namespace
Element eleService=new Element("Service",NSSERVICE);
// --------------

eleService.setAttribute("type", "ServiceHotel", NSSCHEMA);
eleService.setAttribute("availToken",contractInfo[1]);
barceloDS_requests.addContent(eleService);

这将创建以下内容的正确输出:

<ServiceAddRQ echoToken="DummyEchoToken" version="2013/12"
  xmlns="http://www.test.com/schemas/2005/06/messages"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://www.test.com/schemas/2005/06/messages ServiceAddRQ.xsd">  
    <Service xsi:type="ServiceHotel" availToken="1jMqWGjqrx25Bp60gV2Qggb3"/>
</ServiceAddRQ>

service元素不需要它自己的xmlns:xsi声明,因为它是从父元素继承的,但是如果您特别想添加一个冗余的声明,那么可以使用eleService.AddNamespaceDeclaration(NSSCHEMA)但是不能保证,因为序列化器总是可以在不改变结果语义的情况下省略冗余的名称空间声明。

 类似资料:
  • 可能重复: 在锚中放置div是否正确? 当我们编写某种“产品列表”时,您只需要一个链接,但它应该包含产品图像、产品名称、产品标题等。我们可以使用contain p或其他标签吗?是否存在跨浏览器问题? 我听说在html5中,一个标签可以包含p标签,但是仍然没有使用它的信心。 一些代码是这样的:

  • (仅限类和接口,必需) (仅限类和接口,必需。请参见脚注1) (仅限方法和构造函数) (仅限方法) (是Javadoc 1.2中添加的同义词) (或或) (请参阅如何以及何时弃用API) 在这里,似乎被标记为“required”,即使不是这样。这在我看来很奇怪。事实上,后来在同一份文件中,我发现了以下陈述: 您可以提供一个@author标记、多个@author标记或不提供@author标记。

  • 问题内容: 假设有一个docker映像,有人对其进行了更改,然后将其推送到docker存储库。然后,我拉下图像。有没有办法获取该图像并运行上一层的容器?在进行更改之前运行版本。 如果我运行docker history,它将看起来像这样: 如果我想出一种方法来标记或标识图像的先前层,则好像可以运行早期版本。 问题答案: 如果可以访问图像,可以通过标记图像的构建层来对其进行标记。如上所述这里。 在您的

  • 问题内容: 我想知道是否有必要使用完。该标记的信息,这是一个样式表-所以就我而言,实际上并没有添加任何东西。 HTML唯一使用的样式表格式仍然是CSS,因此对浏览器“说”什么?某些网站似乎添加了属性,而其他网站则没有。 那么,什么是使用的元素,是有必要包括它? 问题答案: HTML5规范不是必需的,但对于旧版本的HTML是必需的。 HTML 4 W3.org规范 Type代表样式表的MIME类型。

  • 问题内容: 我有一个SQL数据库,用于存储用户和与用户相关联的标签(许多关系)。我有带有表,表和“桥”表的经典架构,该表将用户与标签链接在一起: 现在,我使用以下函数进行查询以逗号分隔的字段的形式检索所有用户及其标签: 这给了我正确的输出: 问题是,现在我想在此基础上实现标签过滤,即能够按标签(或多个标签)查询用户。过滤器应使用AND运算符工作。 例如:获得标记为红色(10)和绿色(20)的用户:

  • 使用合成标记和图层标记可存储注释和其他元数据,以及标记合成或图层中的重要时刻。合成标记显示在合成的时间标尺上,而每个图层标记显示在相应图层的持续时间条上。两种标记都可以保存相同的信息。 标记可以指单个时间点,也可以指一段持续时间。 After Effects 中的合成标记对应于 Adobe Premiere Pro 中的顺序标记。After Effects 中的图层标记对应于 Adobe Prem