I have a xml file which has a tag as below:
<locator xlink:type="locator" xlink:href="https://www.google.co.in/" xlink:title="Google" xlink:show="replace" xlink:actuate="onRequest" xlink:role="website" rank="1"> </locator>
There are many locator tag in the xml file with different roles and rank .
I am able to get the role of the above tag using #*[local-name()='role'.
Now I need to get the rank attribute based on the role.
Is there any way to fetch two attributes and there values together?
I am new to Xpath . Please help me with this.
Well //locator[#xlink:role = 'website']/#rank (with a suitable binding of the prefix xlink to the namespace http://www.w3.org/1999/xlink) is an example of selecting the rank attributes of locator elements where the role is website.
I am able to get the role of the above tag using
#*[local-name()='role'.
Now I need to get the rank attribute based on the role. Is there any
way to fetch two attributes and there values together?
Use:
ExprStartYouDidntShow/#*[local-name()='role' or name()='rank']
where ExprStartYouDidntShow is the expression selecting the elemen(s) whose two attributes should be selected.
Or, if you need to get these two attributes only when the role attribute has a particular value -- say "wantedValue", use:
ExprStartYouDidntShow/locator[#*[local-name() = 'role'] = 'website']
/#*[local-name()='role' or name()='rank']
Related
I am documenting a java API but the keys for properties that are maps or associative arrays are represented as property1, property2, property3 ... etc.
this is an example of that
#Schema(
description = " This object contains the plans selected by the user.",
name = "plans")
var plans: Map<Int, Plan> = ConcurrentHashMap()
the representation of the generated example in the UI is good in terms of content but I would like to replace just the generated keys by the real ones.
ie property1 by 258.
can someone helpme on how can I get this done using springdoc and its annotations ?
I need to verify that JSON contains values in two fields.
Can I verify that some JSON contains two values, for example ...
$.field1.field2 = test && $.field3[*].field4 = test2
...using JsonPath?
I can successfully validate one field but I don't know how to validate multiple fields
You can use a JsonPath Filter for each condition and you can combine filters with and.
For example:
Filter combinedFilter = Filter.filter(
Criteria.where("$.field1.field2").is("test").and("$.field3[*].field4").is("test2")
);
JsonPath.parse(json).read("$", combinedFilter);
More details in the docs.
In Java I parse a XML document. This XML is a Purchase Order and from this XML I create a PO document in our ERP-system.
I use domparser to parse the XML.
So eventually I have code like this:
--this is an excerpt --
//ShipTo
Element shipToElement = CXMLHandlerObj.getChildElement(elementOrderRequestHeader, "ShipTo");
//Address
Element shipToAddressElement = CXMLHandlerObj.getChildElement(shipToElement, "Address");
/*get attributes of Address*/
notesHandlerObj.docOrder.replaceItemValue("ShipToParty_addressID", shipToAddressElement.getAttribute("addressID"));
notesHandlerObj.docOrder.replaceItemValue("ShipToParty_addressIDDomain", shipToAddressElement.getAttribute("addressIDDomain"));
notesHandlerObj.docOrder.replaceItemValue("ShipToParty_isoCountryCode", shipToAddressElement.getAttribute("isoCountryCode"));
But the XML also contains at the top a OrderRequestHeader which has a type attribute in it:
<OrderRequestHeader orderDate="2017-04-04T12:00:00+00:00" orderID="4550144777" orderType="regular" orderVersion="1" type="new">
Below this element all the details of the order are found.
The "type" attribute can have values like : New or Update.
The type will be "new" if the PO XML is send for the first time and the type will be "update" if the same PO is sent but then with an update contained within it.
Note that the XML structure is the same but only the type is different.
When the type is "New", I will just parse the XML and create the PO document. But if the type is "Update" then I want to check every element and update the document and mail the changes accordingly..
Now the problem is that for the parsing of the XML I need to create a new PO or update an existing one. This I can do by the following ways:
1. creating two methods :
1. create new PO
2. update PO
In the create method I can parse the xml and add values from element to the document.
In the update method I can parse again all elements but also check which data has been changed.
2. I can put a if and else statement before every element
The methods of above are a bit redudant is there any simpler way of doing this?
I have an attribute, like telephonenumber, which appears several times on a person. Now I want to replace all numbers by a list of new numbers:
<person>
<telephonnumber>12345</telephonnumber>
<telephonnumber>23456</telephonnumber>
</person>
replace by:
<person>
<telephonnumber>56789</telephonnumber>
<telephonnumber>78901</telephonnumber>
</person>
How can I do this in Java?
Using
mods.add(new ModificationItem(DirContext.REPLACE_ATTRIBUTE, new BasicAttribute("telephonnumber", "56789")));
mods.add(new ModificationItem(DirContext.REPLACE_ATTRIBUTE, new BasicAttribute("telephonnumber", "78901")));
ends up with all values will be replaced by the last ModificationItem. Well I could work around by removing all number, and adding all new values from the list. But I think Java LDAP supports it directly.
You want to create a single replace with your multi-valued telephone attribute. See the Oracle LDAP attributes tutorial.
// Create a multivalued attribute that has four String values
BasicAttribute oc = new BasicAttribute("objectClass", "top");
oc.add("person");
oc.add("organizationalPerson");
oc.add("inetOrgPerson");
Tip: First try out your LDAP operations via an LDIF file before you start coding.
I have a XML file with many copies of table node structure as below:
<databasetable TblID=”123” TblName=”Department1_mailbox”>
<SelectColumns>
<Slno>dept1_slno</Slno>
<To>dept1_to</To>
<From>dept1_from</From>
<Subject>dept1_sub</Subject>
<Body>dept1_body</Body>
<BCC>dept1_BCC</BCC>
<CC>dept1_CC</CC>
</SelectColumns>
<WhereCondition>MailSentStatus=’New’</WhereCondition>
<UpdateSuccess>
<MailSentStatus>’Yes’</MailSentStatus>
<MailSentFailedReason>’Mail Sent Successfully’</MailSentFailedReason>
</UpdateSuccess>
<UpdateFailure>
<MailSentStatus>’No’</MailSentStatus>
<MailSentFailedReason>’Mail Sending Failed ’</MailSentFailedReason>
</ UpdateFailure>
</databasetable>
As it is not an efficient manner to traverse the file for each time to fetch the details of each node for the queries in the program, I used the nested hashmap concept to store the details while traversing the XML file for the first time. The structure I used is as below:
MapMaster
Key Value
123 MapDetails
Key Value
TblName Department1_mailbox
SelectColumns mapSelect
Key Value
Slno dept1_slno
To dept1_to
From dept1_from
Subject dept1_sub
Body dept1_body
BCC dept1_BCC
CC dept1_CC
WhereCondition MailSentStatus=’New’
UpdateSuccess mapUS
MailSentStatus ’Yes’
MailSentFailedReason ’Mail Sent Successfully’
UpdateFailure mapUF
MailSentStatus ’No’
MailSentFailedReason ’Mail Sending Failed’
But the problem I’m facing now is regarding retrieving the Value part using the nested Keys. For example,
If I need the value of Slno Key, I have to specify TblID, SelectColumns, Slno in nested form like:
Stirng Slno = ((HashMap)((HashMap)mapMaster.get(“123”))mapDetails.get(“SelectColumns”))mapSelect.get(“Slno”);
This is unconvinent to use in a program. Please suggest a solution but don’t tell that iterators are available. As I’ve to fetch the individual value from the map according to the need of my program.
EDIT:my program has to fetch the IDs of the department for which there is privilege to send mails and then these IDs are compared with the IDs in XML file. Only information of those IDs are fetched from XML which returned true in comparison. This is all my program. Please help.
Thanks in advance,
Vishu
Never cast to specific Map implementation. Better use casting to Map interface, i.e.
((Map)one.get("foo")).get("bar")
Do not use casting in your case. You can define collection using generics, so compiler will do work for you:
Map<String, Map> one = new HashMap<String, Map>();
Map<String, Integer> two = new HashMap<String, Integer>();
Now your can say:
int n = one.get("foo").get("bar");
No casting, no problems.
But the better solution is not to use nested tables at all. Create your custom classes like SelectColumns, WhereCondition etc. Each class should have appropriate private fields, getters and setters. Now parse your XML creating instance of these classes. And then use getters to traverse the data structure.
BTW if you wish to use JAXB you do not have to do almost anything! Something like the following:
Unmarshaller u = JAXBContext.newInstance(SelectColumns.class, WhereCondition.class).createUnmarshaller();
SelectColumns[] columns = (SelectColumns[])u.unmarshal(in);
One approach to take would be to generate fully qualified keys that contain the XML path to the element or attribute. These keys would be unique, stored in a single hashmap and get you to the element quickly.
Your code would simply have to generate a unique textual representation of the path and store and retrieve the xml element based on the key.