JAVA:使用Xmlserializer编写xml - 上下文问题

时间:2015-06-02 12:43:17

标签: java android xml

我正在尝试编写XML文档并对其进行POST,但在使用XmlSerializer(我在Android Studio中工作)时无法获得文档的格式。

我想写的XML:

<?xml version="1.0" encoding="UTF-8"?>
<ser:serviceParameters xmlns:ser="http://www.endinfosys.com/Voyager/serviceParameters">
  <ser:parameters>
      <ser:parameter key="action">
         <ser:value>add</ser:value>
      </ser:parameter>
  </ser:parameters>
  <ser:patronIdentifier lastName="LastName" patronHomeUbId="1@DB" patronId="12345">
     <ser:authFactor type="B">150</ser:authFactor>
  </ser:patronIdentifier>
  <ser:definedParameters xsi:type="pat:bookbagRecordsType" xlns:pat="http://www.endinfosys.com/Voyager/patronPreferences" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
     <pat:record>
          <pat:bibId>54414</pat:bibId>
          <pat:databaseCode>LOCAL</pat:databaseCode>
     </pat:record>
  </ser:definedParameters>
</ser:serviceParameters>

这是我必须生成XML的代码:

private static String writeXml(String surname, String barcode, String thisbibid){
    XmlSerializer serializer = Xml.newSerializer();
    StringWriter writer = new StringWriter();
    try {
        serializer.setOutput(writer);
        serializer.startDocument("UTF-8", true);
        serializer.startTag("ser", "serviceParameters");
        serializer.attribute("http://www.endinfosys.com/Voyager/serviceParameters", "xmlns", "ser");
        serializer.startTag("ser", "parameters");
        serializer.startTag("ser", "parameter");
        serializer.attribute("ser", "action", "add");
        serializer.endTag("ser", "parameter");
        serializer.endTag("ser", "parameters");
        serializer.startTag("ser", "patronIdentifier");
        serializer.attribute("", "lastName", surname);
            serializer.attribute("", "patronHomeUbId", "local");
            serializer.attribute("", "patronId", "12345");
            serializer.startTag("ser", "authFactor");
                serializer.attribute("", "type", "B");
        serializer.text("150");
            serializer.endTag("ser", "authFactor");
        serializer.endTag("ser", "patronIdentifier");
        serializer.startTag("ser", "definedParameters");
        serializer.attribute("http://www.endinfosys.com/Voyager/patronPreferences", "xmlns", "pat");
        serializer.attribute("pat", "bookbagRecordsType", "xsi:type");
        serializer.startTag("pat", "record");
            serializer.startTag("pat", "bibId");
                serializer.text(thisbibid);
            serializer.endTag("pat", "bibId");
            serializer.startTag("pat", "databaseCode");
                serializer.text("LOCAL");
            serializer.endTag("pat", "databaseCode");
        serializer.endTag("pat", "record");
        serializer.endTag("ser", "definedParameters");
        serializer.endTag("ser", "serviceParameters");
        serializer.endDocument();
        return writer.toString();
    } catch (Exception e) {
        throw new RuntimeException(e);
    }
}

但String输出是:

<?xml version='1.0' encoding='UTF-8' standalone='yes' ?><n0:serviceParameters n1:xmlns="ser" xmlns:n0="ser" xmlns:n1="http://www.endinfosys.com/Voyager/serviceParameters"><n0:parameters><n0:parameter n0:action="add" /></n0:parameters><n0:patronIdentifier lastName="LastName" patronHomeUbId="local" patronId="12345"><n0:authFactor type="B">150</n0:authFactor></n0:patronIdentifier><n0:definedParameters n2:xmlns="pat" n3:bookbagRecordsType="xsi:type" xmlns:n2="http://www.endinfosys.com/Voyager/patronPreferences" xmlns:n3="pat"><n3:record><n3:bibId>54414</n3:bibId><n3:databaseCode>LOCAL</n3:databaseCode></n3:record></n0:definedParameters></n0:serviceParameters>

我尝试更改.attribute元素的顺序,但无法正确获取前缀。任何帮助将不胜感激

2 个答案:

答案 0 :(得分:0)

哪个包是Xml.newSerializer()??我正在尝试重现您的错误,显然您的代码没问题。它应该返回预期的XML。

答案 1 :(得分:0)

在找到setPrefix方法和大量的试错之后,我得到了XML的格式以匹配所需的格式。

private static String writeXml(String surname, String barcode, String thisbibid){
    XmlSerializer serializer = Xml.newSerializer();
    StringWriter writer = new StringWriter();
    try {
        serializer.setOutput(writer);
        serializer.startDocument("UTF-8", true);
        serializer.setPrefix("ser", "http://www.endinfosys.com/Voyager/serviceParameters");
        serializer.startTag("", "ser:serviceParameters");
        serializer.startTag("", "ser:parameters");
        serializer.startTag("", "ser:parameter");
        serializer.attribute("", "key", "action");
        serializer.startTag("", "ser:value");
        serializer.text("add");
        serializer.endTag("", "ser:value");
        serializer.endTag("", "ser:parameter");
        serializer.endTag("", "ser:parameters");
        serializer.startTag("", "ser:patronIdentifier");
        serializer.attribute("", "lastName", surname);
        serializer.attribute("", "patronHomeUbId", "local");
        serializer.attribute("", "patronId", "12345");
        serializer.startTag("", "ser:authFactor");
        serializer.attribute("", "type", "B");
        serializer.text("150");
        serializer.endTag("", "ser:authFactor");
        serializer.endTag("", "ser:patronIdentifier");
        serializer.setPrefix("pat", "http://www.endinfosys.com/Voyager/patronPreferences");
        serializer.setPrefix("xsi", "http://www.w3.org/2001/XMLSchema-instance");
        serializer.startTag("", "ser:definedParameters");
        serializer.attribute("", "xsi:type", "pat:bookbagRecordsType");
        serializer.startTag("", "pat:record");
            serializer.startTag("", "pat:bibId");
                serializer.text(thisbibid);
            serializer.endTag("", "pat:bibId");
            serializer.startTag("", "pat:databaseCode");
                serializer.text("LOCAL");
            serializer.endTag("", "pat:databaseCode");
        serializer.endTag("", "pat:record");
        serializer.endTag("", "ser:definedParameters");
        serializer.endTag("", "ser:serviceParameters");
        serializer.endDocument();
        return writer.toString();
    } catch (Exception e) {
        throw new RuntimeException(e);
    }
}

必须在http://developer.android.com/reference/org/xmlpull/v1/XmlSerializer.html的文档中明确设置前缀,然后在开始/结束标记中设置“硬代码”。

现在将foward转移到下一个绊脚石;)