从XML数组中提取单个值

时间:2020-01-10 01:59:43

标签: xml xpath xmllint

我有以下XML:

<computer>
<extension_attributes>
    <extension_attribute>
      <id>22</id>
      <name>aname</name>
      <type>String</type>
      <multi_value>false</multi_value>
      <value>auidhg</value>
    </extension_attribute>
    <extension_attribute>
      <id>23</id>
      <name>ap</name>
      <type>String</type>
      <multi_value>false</multi_value>
      <value>d3HtVD</value>
    </extension_attribute>
</extension_attributes>
</computer>

我想要提取名称为“ aname”的扩展属性项目的值(即,我想要值auidhg)。我想知道是否有xmllint可以使用的Xpath语句?

1 个答案:

答案 0 :(得分:1)

使用predicate选择合适的import javafx.animation.KeyFrame; import javafx.animation.Timeline; import javafx.application.Application; import javafx.beans.property.IntegerProperty; import javafx.beans.property.SimpleIntegerProperty; import javafx.scene.Scene; import javafx.scene.control.Button; import javafx.scene.control.Label; import javafx.scene.layout.HBox; import javafx.scene.layout.VBox; import javafx.stage.Stage; import javafx.util.Duration; /** * @author Sedrick */ public class App extends Application { Timeline timeline; Button button1 = new Button("Start"); Button button2 = new Button("Start"); Boolean btn1IsRunning = false; Boolean btn2IsRunning = false; @Override public void start(final Stage primaryStage) { IntegerProperty counter1 = new SimpleIntegerProperty(9); IntegerProperty counter2 = new SimpleIntegerProperty(9); timeline = new Timeline(new KeyFrame(Duration.seconds(1), (t) -> { if(btn1IsRunning && !button1.getText().equals("Done")) { counter1.set(counter1.get() - 1); } if(counter1.get() == 0) { System.out.println("Done!"); button1.setText("Done"); } System.out.println("counter 1: " + counter1.get()); if(btn2IsRunning && !button2.getText().equals("Done")) { counter2.set(counter2.get() - 1); } if(counter2.get() == 0) { System.out.println("Done!"); button2.setText("Done"); } System.out.println("counter 2: " + counter2.get()); if(button1.getText().equals("Done")&& button2.getText().equals("Done")) { timeline.stop(); } })); timeline.setCycleCount(Timeline.INDEFINITE); button1.setOnAction((t) -> { switch(button1.getText()) { case "Start": if(timeline.getStatus() != Timeline.Status.RUNNING) { timeline.play(); } btn1IsRunning = true; button1.setText("Pause"); break; case "Pause": btn1IsRunning = false; button1.setText("Start"); break; } }); Label label1 = new Label(); label1.textProperty().bind(counter1.asString()); button2.setOnAction((t) -> { switch(button2.getText()) { case "Start": if(timeline.getStatus() != Timeline.Status.RUNNING) { timeline.play(); } btn2IsRunning = true; button2.setText("Pause"); break; case "Pause": btn2IsRunning = false; button2.setText("Start"); break; } }); Label label2 = new Label(); label2.textProperty().bind(counter2.asString()); VBox root = new VBox(new HBox(button1, label1), new HBox(button2, label2)); Scene scene = new Scene(root, 300, 200); primaryStage.setTitle(this.getClass().getSimpleName()); primaryStage.setScene(scene); primaryStage.show(); } /** * @param args the command line arguments */ public static void main(final String[] args) { Application.launch(args); } } 应该很容易。

此XPath:

extension_attribute

返回:

//extension_attribute[name='aname']/value

如果只需要文本值,则可以选择文本节点...

<value>auidhg</value>

或使用string()normalize-space() ...

//extension_attribute[name='aname']/value/text()

任何这些返回:

normalize-space(//extension_attribute[name='aname']/value)

请参阅上面的链接,以获取有关string()和normalize-space()函数的更多详细信息,以及何时仅使用text()可能更合适。

相关问题