Search code examples
node.jsjsonjqstringifyxml2js

Parse result of XML -> XML2JS ->JSON.stringify using JQ


I have a file created by doing an XHR fetch of XML and parsing it through the node module xlm2js and then JSON.stringify. It has about 700 segments of two basic types. This is an edited version of the file with one segment of each type:

{
  "NewDataSet": {
    "Table": [
      {
        "SegmentID": [
          "2342"
        ],
        "StationID": [
          "005es00045:_MN_Stn"
        ],
        "SegmentName": [
          "I-5 NB MP0.45 @ SR-14"
        ],
        "SegmentType": [
          "2"
        ],
        "SegmentLength": [
          "1135"
        ],
        "MinimumLanesReporting": [
          "0.5"
        ],
        "CalculationThreshold": [
          "30"
        ],
        "CalculationPeriod": [
          "2"
        ],
        "MinimumSamples": [
          "3"
        ],
        "SegmentMaximumFilter": [
          "774"
        ],
        "SegmentMinimumFilter": [
          "12"
        ],
        "StandardDeviationSamples": [
          "15"
        ],
        "StandardDeviationMultiplier": [
          "1.96"
        ],
        "UseStandardDeviationFilter": [
          "false"
        ],
        "IsActive": [
          "true"
        ]
      },
      {
        "SegmentID": [
          "3051"
        ],
        "BeginningDcuID": [
          "584"
        ],
        "EndDcuID": [
          "589"
        ],
        "SourceSystem": [
          "TravelTime"
        ],
        "SegmentName": [
          "OR212 at SE 242nd Ave to OR212 at SE Foster Rd"
        ],
        "SegmentType": [
          "1"
        ],
        "SegmentLength": [
          "100"
        ],
        "CalculationThreshold": [
          "60"
        ],
        "CalculationPeriod": [
          "10"
        ],
        "MinimumSamples": [
          "3"
        ],
        "SegmentMaximumFilter": [
          "3600"
        ],
        "SegmentMinimumFilter": [
          "50"
        ],
        "StandardDeviationSamples": [
          "20"
        ],
        "StandardDeviationMultiplier": [
          "1.96"
        ],
        "UseStandardDeviationFilter": [
          "true"
        ],
        "IsActive": [
          "true"
        ]
      }
    ]
  }
}

I need to ignore the "SegmentType":["2"] segments and extract SegmentID, SegmentName, BeginningDcuID, EndingDcuID, and SegmentLength from the type 1 segments where IsActive is true.

I can list the file with jq "." but any attempt at other operations with jq fail, usually with the message:

'jq: error: syntax error, unexpected '[' (Unix shell quoting issues?) at , line 1:'

Any suggestions for jq syntax changes or xml2js parameter changes to make this work would be outstandingly helpful.


Solution

  • Never use double quotes for quoting an argument if there is nothing in it that you want the shell to expand.

    $ jq '.NewDataSet.Table[]
    | select(.SegmentType[0] != "2" and .IsActive[0] == "true")
    | (.SegmentID, .SegmentName, .BeginningDcuID, .EndingDcuID, .SegmentLength)[0]' file
    "3051"
    "OR212 at SE 242nd Ave to OR212 at SE Foster Rd"
    "584"
    null
    "100"