Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Difficulty treating some numeric tags as string #646

Open
1 of 2 tasks
chris-gilbert-2 opened this issue Mar 11, 2024 · 4 comments
Open
1 of 2 tasks

Difficulty treating some numeric tags as string #646

chris-gilbert-2 opened this issue Mar 11, 2024 · 4 comments

Comments

@chris-gilbert-2
Copy link

chris-gilbert-2 commented Mar 11, 2024

Description

I have an input structure where some numeric values are to be treated as strings. Rather than calling toString in multiple places in my code, I hoped to use the parsing options, but looking at the codebase I think it is not currently possible using either numberOptions or tagValueProcessor.

Input

<?xml version="1.0" encoding="UTF-8"?>
<root>
    <id>132330</id>
    <nested>
          <id>191458</id>
          <count>1500</count>
    </nested>
</root>

Code

  const options = {
   tagValueProcessor: (tagName: string, tagValue: unknown) =>
      tagName === "id" ? `${tagValue}` : tagValue,
  };
  const parsed =  new XMLParser(options).parse(input);

Output

{
  '?xml': '',
  root: {
    id: 132330,
    nested: { 
      id: 191458, 
      count: 1500 
    } 
  }
}

expected data

{
  '?xml': '',
  root: {
    id: '132330',
    nested: { 
      id: '191458', 
      count: 1500 
    } 
  }
}

I see why there is no conversion - the input type is string and so is the output type, so when the tagValueProcessor is applied, parsing is not skipped.

I can't use the skipLike property of numberParseOptions because strnum only receives the value without the tag name for context. I can't safely use a regex to differentiate IDs from other numbers.

I can't use the parseTagValue option because that is a universal setting that can't be applied to specific tags.

I think the simplest (backward compatible) approach that would work for me, would be another option like parseTagValue, but which takes a function with the same inputs as tagValueProcessor or isArray, and returns boolean, so that enabling parsing can be finer grained.

Would you like to work on this issue?

  • Yes
  • No

Bookmark this repository for further updates. Visit SoloThought to know about recent features.

Copy link

We're glad you find this project helpful. We'll try to address this issue ASAP. You can vist https://solothought.com to know recent features. Don't forget to star this repo.

@amitguptagwl
Copy link
Member

You can also try v5 experimental changes. But no detail tutorial is available currently. You can follow this guideline.

@enjdusan
Copy link

I have a similar issue, where it tries to parse number-like value to number.
For instance

<Address>
    <Udprn>09123456</Udprn>
</Address>

gets parsed into number

{ Address: { Udprn: 9123456 } }

which is obviously wrong, because it throws away leading 0 as it converts a string to a number.

@amitguptagwl
Copy link
Member

Have you tried numberParseOptions?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants