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

如何在java中解组这种类型的xml

朱兴运
2023-03-14

我是Rest API的新手。我有一个xml输出需要解封。以下是xml输出:

<dsml>
    <entries>
        <entry dn="uid=7686,c=in,ou=pages,o=example.com">
            <att name="uid">
                <value>7568766</value>
            </att>
            <att name="email">
                <value>new@gmail.com</value>
            </att>
            <att name="callname">
                <value>John</value>
            </att>
        </entry>
        <entry dn="uid=7689,c=in,ou=pages,o=example.com">
            <att name="uid">
                <value>7678766</value>
            </att>
            <att name="callname">
                <value>Mike</value>
            </att>
        </entry>
        <entry dn="uid=7690,c=in,ou=pages,o=example.com">
            <att name="uid">
                <value>75858766</value>
            </att>
            <att name="email">
                <value>old@gmail.com</value>
            </att>
            <att name="callname">
                <value>rahul</value>
            </att>
        </entry>
    </entries>
</dsml>

实际的xml输出总共有37个条目。下面是模型类:

@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name = "user")
public class User implements Serializable{
    private static final long serialVersionUID = 1L;

    @XmlElement(name = "uid")
    private int uid;

    @XmlElement(name = "callname")
    private String callname;

    @XmlElement(name = "email")
    private String email;

    public int getId() {
        return uid;
    }
    public void setId(int uid) {
        this.uid = uid;
    }
    public String getFirstName() {
        return callname;
    }
    public void setFirstName(String callname) {
        this.callname = callname;
    }
    public String getmail() {
        return email;
    }
    public void setmail(String email) {
        this.email = email;
    }
}

下面是Rest Api类代码:

public class UsingRestAPI {
    public static void main(String[] args) 
    {
        try
        {
            URL url = new URL("www.example.com");
            HttpURLConnection conn = (HttpURLConnection) url.openConnection();
            conn.setRequestMethod("GET");
            conn.setRequestProperty("Accept", "application/xml");

            if (conn.getResponseCode() != 200) 
            {
                throw new RuntimeException("Failed : HTTP error code : " + conn.getResponseCode());
            }

            BufferedReader br = new BufferedReader(new InputStreamReader((conn.getInputStream())));
            String apioutput="",temp="";
            while ((apioutput = br.readLine()) != null) {
                temp += apioutput;
                System.out.println(apioutput);
            }


            JAXBContext jaxbContext = JAXBContext.newInstance(User.class);
            Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();
            User user = (User) jaxbUnmarshaller.unmarshal(new StringReader(temp));

            System.out.println(user.getId());
            System.out.println(user.getFirstName());
            System.out.println(user.getmail());

        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (JAXBException e) {
            e.printStackTrace();
        }
    }
}

在执行此代码时,我收到错误

javax.xml.bind.UnMarshalException-带有链接异常:[org.xml.sax.saxParseException;LineNumber:1;ColumnNumber:110;外部DTD:无法读取外部DTD“dsml.DTD”,因为accessExternalDTD属性设置的限制不允许“HTTP”访问。]

我尝试将属性ACCESS_EXTERNAL_DTD更改为true,但它给出了另一个错误:

javax.xml.bind.PropertyException: name: http://javax.xml.XMLConstants/property/accessExternalDTD value: true
    at javax.xml.bind.helpers.AbstractUnmarshallerImpl.setProperty(Unknown Source)
    at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallerImpl.setProperty(Unknown Source)
    at UsingRestAPI.main(UsingRestAPI.java:60)

共有1个答案

傅玮
2023-03-14

为什么不将Xml保存在文件中,然后将其传递到unmarshal中

新版本_:

User user = (User) jaxbUnmarshaller.unmarshal(new File("c:/temp/user.xml") );//File path

它不会给出任何错误。

 类似资料:
  • 问题内容: 在Java中解析此日期格式的最简单方法是什么? 我在Java中阅读了DateFormat api,却找不到采用字符串甚至这种类型的日期格式作为要解析的参数的方法?当我说的是解析时,我的意思是我想将“日期(月,日,年)”,“时间”和“时区”提取到单独的字符串对象中。 提前致谢 问题答案: 另一个答案是,由于您似乎只专注于拆开(恕我直言,这不是一个好主意)。我们假设字符串是有效的ISO86

  • 我正在使用Java,我正在尝试调查和学习健康市场科学的sqlBuilder源代码。您可以通过添加此maven依赖项来获取源代码。 文件BaseCreateQuery。类具有以下代码 我想知道这个类型(在第1行)是什么意思。这与Java中的泛型有关吗。我研究了Java中的泛型,但没有找到对这种类型的引用。TypeScript具有ThisType构造。这类似于Java中的这种类型吗?

  • 已知一个有很多属性的对象: 如何定义一个键值对应的数组? 尝试之后key: 'test1'总是能对上value: 2 ... 求助大佬!

  • 我是企业架构师的新手。我想知道有没有一种方法可以从已经存在的其他类型的图中自动生成某种类型的图,如果有的话--可以实现哪种类型的图。 例如,序列图是否可以从给定的类图中生成?或者这是不可能的,因为序列图是行为的,而类图是结构的? 提前道谢!

  • 问题内容: 运行前三行会发出; 如何得到 ???要长吗?我可以解析该字符串,然后执行Class.forname(),但这很糟糕。简单的方法是什么? 问题答案: 写就好了 从JavaDoc: 返回表示数组的组件类型的信息。如果此类不表示数组类,则此方法返回。

  • 考虑以下代码: 在上面的例子中,当我尝试arr2[0]=a时,我得到了ArrayStoreException。这意味着数组会记住它必须接受的类型。但是列表不记得它们。它只是简单地编译并运行良好。当我检索对象BB时,将抛出ClassCastException。 所以问题是: > 数组如何记住它的类型(我知道它被称为“具体化”)。这到底是怎么发生的? 为什么只有数组被赋予这种能力,而不是ArrayLi