Как сделать XML с объекта
1 SicaYoumi [2018-08-16 06:40:00]
Я хочу спросить, как сгенерировать xml из объекта?
скажем, если это json, мне просто нужно использовать jaskson или Gson
json = someObj.writeValueAsString
но затем для xml, который я просматриваю через Интернет, кажется, что он должен сначала сконструировать документ? как записать его в streamwriter, а затем вывести на какой-то каталог, который станет файлом (xxx.xml)?
Но моя цель состоит в том, чтобы construst (от объекта) и проанализировать xml для другого RESTful API.
А также, если кто-то может помочь с разбором, я был бы очень доволен. Я имею в виду, как вызвать запрос Http и поместить xml в тело и запустить какой-то URL-адрес.
val url = "https://api.mch.weixin.qq.com/pay/unifiedorder"
val headers = HttpHeaders()
headers.contentType = MediaType.APPLICATION_XML
val xmlMapper = XmlMapper()
var strObject = xmlMapper.writeValueAsString(wxPayOrderWithSign).replace(Regex("<[^>]*?/>"), "")
strObject = strObject.substring(12,strObject.length - 13)
strObject = "<xml>$strObject</xml>"
val entity = HttpEntity(strObject, headers)
val respEntity = restTemplate.postForEntity(url, entity, String::class.java)
val return_msg = respEntity.body
вот его мой код в kotlin, но это не правильный метод, так как я использую regex для замены какого-либо символа при преобразовании объекта в строку.
мне нужно сгенерировать что-то вроде
<xml>
<appid>wx0b6d2803d20b379f1</appid>
<body>QQMember-TopUp</body>
<detail>test</detail>
<mch_id>1508478951</mch_id>
<nonce_str>c9c21120a9724ee993e6f9c866ec30e1</nonce_str>
<notify_url>http://wxpay.wxutil.com/pub_v2/pay/notify.v2.php</notify_url>
<out_trade_no>20150806125346</out_trade_no>
<sign>6E18248C5FFA26D1A96BD8F6A0B0CB02</sign>
<spbill_create_ip>123.12.12.123</spbill_create_ip>
<total_fee>1</total_fee>
<trade_type>JSAPI</trade_type>
</xml>
java object xml xml-parsing kotlin
1 ответ
2 Samuel Morais [2018-08-16 07:27:00]
JAXB поставляется с java-sdk с версии 6 и обеспечивает простой способ для mashalling и unmashalling java-объектов:
@XmlRootElement
public class Transaction {
private Long id;
private Float value;
private Boolean authorized;
public static void main(String[] args) throws JAXBException {
Transaction transaction = new Transaction();
transaction.setId(1L);
transaction.setValue(20.9f);
transaction.setAuthorized(true);
JAXBContext jaxbContext = JAXBContext.newInstance( Transaction.class );
Marshaller jaxbMarshaller = jaxbContext.createMarshaller();
jaxbMarshaller.setProperty( Marshaller.JAXB_FORMATTED_OUTPUT, true );
jaxbMarshaller.marshal( transaction, new File( "transaction.xml" ) );//save to file
jaxbMarshaller.marshal( transaction, System.out ); //send to stdout
//raw xml as string
StringWriter writer = new StringWriter();
jaxbMarshaller.marshal( transaction, writer);
String rawXml = writer.toString();
}
}
Выход:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<transaction>
<authorized>true</authorized>
<id>1</id>
<value>20.9</value>
</transaction>
Используя RestTemplate, вы можете просто передать объект, который должен быть отправлен как XML в конструкторе HttpEntity, например:
Transaction transaction = new Transaction();
transaction.setId(1L);
transaction.setValue(20.9f);
transaction.setAuthorized(true);
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_XML);
HttpEntity<Transaction> request = new HttpEntity<Transaction>(transaction, headers);
ResponseEntity<String> response = restTemplate.postForEntity("http://localhost:8080/xml/transactions", request, String.class);