Я пытаюсь создать следующий XML:
<ns10:Payload>
<ns6:MeterReadings>
<ns6:MeterReading>
<ns6:Readings>
<ns6:reportedDateTime>2024-06-02T23:15:11.09+02:00</ns6:reportedDateTime>
<ns6:timeStamp>2024-06-02T23:14:39+02:00</ns6:timeStamp>
<ns6:value>0.234</ns6:value>
<ns6:ReadingType ref = "0.0.0.6.0.1.54.0.0.0.0.0.0.0.128.3.29.0"/>
</ns6:Readings>
<ns6:Readings>
<ns6:reportedDateTime>2024-06-02T23:15:11.09+02:00</ns6:reportedDateTime>
<ns6:timeStamp>2024-06-02T23:14:39+02:00</ns6:timeStamp>
<ns6:value>0.233</ns6:value>
<ns6:ReadingType ref = "0.0.0.6.0.1.54.0.0.0.0.0.0.0.64.3.29.0"/>
</ns6:Readings>
<ns6:UsagePoint>
<ns6:mRID>ES00TRAFGISS03268T120F</ns6:mRID>
</ns6:UsagePoint>
</ns6:MeterReading>
</ns6:MeterReadings>
</ns10:Payload>
Я использовал операцию ++, чтобы добавить элемент UsagePoint в конец списка, но Mule выдает мне ошибку из-за того, что я смешал массив с объектом.
%dw 2.0
output application/xml
ns ns0 http://iec.ch/TC57/2011/MeterReadingsMessage
ns ns01 http://iec.ch/TC57/2011/schema/message
ns ns02 http://iec.ch/TC57/2011/MeterReadings
var meterReadings = payload.MeterReadings
var meterReading = meterReadings.MeterReading
var readings = meterReading.readings[0] as Array<T>
---
ns0#CreatedMeterReadings: {
ns0#Header: {
ns01#Verb: "reply",
ns01#Noun: "MeterReadings"
},
ns0#Payload: {
ns02#MeterReadings: {
ns02#MeterReading: readings map ((reading) -> {
ns02#Readings: {
ns02#reportedDateTime: reading.reportedDateTime,
ns02#timeStamp: reading.timeStamp,
ns02#value: reading.value,
ns02#ReadingType: reading.ReadingType
}
})
reduce ($$ ++ $)
++ ns02#UsagePoint: {
ns02#mRID: "example"
}
}
}
}
Возможно ли сделать то, что я пытаюсь?
@aled добавил полный пример, извините!
Если есть ошибки, добавьте к вопросу полный текст. Также полный ввод для воспроизведения. Прочтите, как написать минимально воспроизводимый пример .





Мне не удалось воспроизвести проблему, возможно, потому, что у вас недостаточно информации для полного воспроизведения. Однако, глядя на желаемый результат, вы можете использовать функцию reduce() для преобразования внутреннего массива в объект. Это позволит достичь желаемого результата.
%dw 2.0
output application/xml
ns ns0 http://something
ns ns02 http://somethingelse
---
ns0#CreatedMeterReadings: {
ns0#Payload: {
ns02#MeterReadings: {
ns02#MeterReading: payload map ((reading) -> {
ns02#Readings: {
ns02#reportedDateTime: reading.reportedDateTime,
ns02#timeStamp: reading.timeStamp,
ns02#value: reading.value,
ns02#ReadingType: reading.ReadingType
}
})
reduce ((item, accumulator = {}) -> accumulator ++ item)
++ ns02#UsagePoint: {
ns02#mRID: "example"
}
}
}
}
Я использовал эти фиктивные данные в качестве входных данных и соответственно изменил выражение для MeterReading:
[
{
"reportedDateTime": 123,
"timeStamp": 1,
"value": 111,
"ReadingType": "x"
},
{
"reportedDateTime": 321,
"timeStamp": 2,
"value": 222,
"ReadingType": "y"
}
]
Выход:
<?xml version='1.0' encoding='UTF-8'?>
<ns0:CreatedMeterReadings xmlns:ns0 = "http://something">
<ns0:Payload>
<ns02:MeterReadings xmlns:ns02 = "http://somethingelse">
<ns02:MeterReading>
<ns02:Readings>
<ns02:reportedDateTime>123</ns02:reportedDateTime>
<ns02:timeStamp>1</ns02:timeStamp>
<ns02:value>111</ns02:value>
<ns02:ReadingType>x</ns02:ReadingType>
</ns02:Readings>
<ns02:Readings>
<ns02:reportedDateTime>321</ns02:reportedDateTime>
<ns02:timeStamp>2</ns02:timeStamp>
<ns02:value>222</ns02:value>
<ns02:ReadingType>y</ns02:ReadingType>
</ns02:Readings>
<ns02:UsagePoint>
<ns02:mRID>example</ns02:mRID>
</ns02:UsagePoint>
</ns02:MeterReading>
</ns02:MeterReadings>
</ns0:Payload>
</ns0:CreatedMeterReadings>
Большое спасибо за помощь. Я попробовал решение, к сожалению, отображается ошибка типа: Невозможно вызвать: reduce с аргументами: (Array<{|ns0#Readings...2011/MeterReadings , ($, $$) -> ?). Причины: - Повторяющееся поле: Readings не поддерживается: `{|ns0#Readings: {|ns...2011/MeterReadings |- From: сокращение<T>(items: Array<T>, обратный вызов: (item: T , аккумулятор: Т) -> Т) -> Т | Нулевой
Кстати, я генерирую данные из компонента Java, поэтому, возможно, типы более запутанны.
Это сложно воспроизвести, поскольку вы не предоставляете фактические данные, однако я считаю, что это связано с автоматической инициализацией аккумулятора в функции уменьшения(). Я обновил свой пример явной инициализацией пустого объекта. Попробуйте это изменение и дайте мне знать.
Большое спасибо! Нашел альтернативу, которая тоже работает. Извините, что не могу предоставить полный пример, некоторая логика создается с использованием автоматически создаваемых классов и специального компонента Java.
Вы можете уменьшить проблему, чтобы избежать этой зависимости в вопросе. В этом и заключается идея минимального воспроизводимого примера .
Мое решение состояло в том, чтобы использовать объект для определения иерархии и использовать массив для списка показаний:
%dw 2.0
output application/xml
ns met http://iec.ch/TC57/2011/MeterReadingsMessage
ns mes http://iec.ch/TC57/2011/schema/message
ns met1 http://iec.ch/TC57/2011/MeterReadings#
var meterReadings = payload.MeterReadings
var meterReading = meterReadings.MeterReading
var readings = meterReading.readings[0]
//var requestData = read(vars.queryOperation.RequestData, "application/json")
---
met#CreatedMeterReadings: {
met#Header: {
mes#Verb: "reply",
mes#Noun: "MeterReadings"
},
met#Payload: {
met1#MeterReadings: {
met1#MeterReading: {
met1#Readings: readings map ((reading) -> {
met1#reportedDateTime: reading.reportedDateTime,
met1#timeStamp: reading.timeStamp,
met1#value: reading.value,
met1#ReadingType @("ref": reading.ReadingType.ref): {}
}),
met1#UsagePoint: {
met1#mRID: "usagePoint"
}
}
}
}
}
Сценарий, которым вы поделились, неполный. Пожалуйста, отредактируйте вопрос, чтобы добавить полный сценарий, который можно использовать для воспроизведения проблемы. Также включите ввод.