Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

how to loop over nested yaml file content?

923 views
Skip to first unread message

Mohammed Suleman khan

unread,
Jan 23, 2016, 9:06:46 AM1/23/16
to
I am having a .yml file that has nested level navigation items that I am going to use for building the navigation. here my .yml file content.

navigationItems:
-
link: /features
label: Features
-
link: /contact
label: Contact Us
-
link: /about
label: About Us
-
link: /services
label: Services
navigationItems:
-
link: /service-1
label: Service 1

I am having two mapper classes navigation and navigatiomItems to map the fields of this yml file, Navigation.groovy

class Navigation {

List<NavigationItem> navigationItems
}

NavigationItem.groovy

class NavigationItem {

String link
String label
List<NavigationItem> navigationItems
}

I am using Jackson objectmapper to map the fields of yml with my mapper class like this:

private Navigation mapYamlNavigation(final String mdFileContents) {
final ObjectMapper mapper = new ObjectMapper(new YAMLFactory()); // jackson databind
Navigation navigations = new Navigation();
// matches true means that we have legit yaml in our .md file
try {
// read and assign the yaml to our properties
navigations = mapper.readValue(mdFileContents, Navigation.class);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return navigations;
}

here I am trying to loop over it to get the all label, links and also the nested ones

private String yamlToHtml() throws FileNotFoundException {
String filePath = "src/main/resources/static/navigation/topnav.yml";
String content = new Scanner(new FileReader(filePath)).useDelimiter("\\Z").next();
Navigation navItems = mapYamlNavigation(content);
for (NavigationItem nav : navItems.getNavigationItems()) {
System.out.println(nav.getLabel());
System.out.println(nav.getLink());
System.out.println(navItems.getNavigationItems().size());
if (navItems.getNavigationItems().size() > 0) {
for (int i=0; i<navItems.getNavigationItems().size(); i++) {
System.out.println(navItems.getNavigationItems().get(i).getLabel());
System.out.println(navItems.getNavigationItems().get(i).getLink());
}
}
}

return null;
}

I am able to get the top ones but I am not able to get the nested ones that is

navigationItems:
-
link: /service-1
label: Service 1

can anyone tell me how can I loop to get the nested ones ? is my yaml file is in correct order ?

Daniel Pitts

unread,
Jan 23, 2016, 10:52:41 AM1/23/16
to
On 1/23/16 6:27 AM, Stefan Ram wrote:
> Mohammed Suleman khan <salmank...@gmail.com> writes:
>> I am having a .yml file that has nested level navigation
>
> public final class Main
> {
>
> private static final java.lang.String source =
> "navigationItems:\n" +
> "-\n" +
> " link: /features\n" +
> " label: Features\n" +
> "-\n" +
> " link: /contact\n" +
> " label: Contact Us\n" +
> "-\n" +
> " link: /about\n" +
> " label: About Us\n" +
> "-\n" +
> " link: /services\n" +
> " label: Services\n" +
> " navigationItems:\n" +
> " -\n" +
> " link: /service-1\n" +
> " label: Service 1\n";
>
> public static void main(String args[]) throws Exception
> { final java.util.regex.Pattern p =
> java.util.regex.Pattern.compile
> ( "^ {6}([^ ].*)$", java.util.regex.Pattern.MULTILINE );
> final java.util.regex.Matcher m = p.matcher( source );
> while( m.find() )java.lang.System.out.println( m.group( 1 )); }}
>
> link: /service-1
> label: Service 1
>
Stefan: why are you using regex to parse Yaml? Yaml has a spec, and its
far more complex than your regex suggests.

Mohammed: The problem is that you're trying to represent a tree
structure as a list. Really you need:

class NavigationNode {
private List<NavigationNode> children;
private String label;
private String link;
}


Then you can use recursion to go through the list.

Hopefully this helps.

Jeff Higgins

unread,
Jan 23, 2016, 11:31:15 AM1/23/16
to
He has:

class NavigationItem {

String link String label List<NavigationItem> navigationItems
}

and also;

I am using Jackson objectmapper to map the fields of yml with my mapper
class like this:

and;

here I am trying to loop over it to get the all label, links and also the
nested ones

private String yamlToHtml() throws FileNotFoundException {
String filePath =
"src/main/resources/static/navigation/topnav.yml";

and;

Navigation.groovy (?) in a couple places.

all apparently to build some html;

I am having a .yml file that has nested level navigation items that I am
going to use for building the navigation. here my .yml file content.

so that I'm not certain whether this cluelessness, trolling, or some
highly developed workflow.
0 new messages