【问题标题】:XML Parsing - Search for specific elementsXML 解析 - 搜索特定元素
【发布时间】:2016-06-01 14:07:39
【问题描述】:

我有一个需要解析的 XML 文档,以便从中提取特定值。 架构与此类似:

    <sequence tag="771b,1030" vr="SQ" card="2" len="988" name="axial_length_values_sequence">
        <item card="6" len="486">
            <element tag="771b,0000" vr="UL" vm="1" len="4" name="PrivateGroupLength">474</element>
            <element tag="771b,0010" vr="LO" vm="1" len="6" name="PrivateCreator">99CZM</element>
            <element tag="771b,1008" vr="CS" vm="1" len="2" name="laterality">R</element>
            <element tag="771b,1043" vr="FD" vm="1" len="8" name="mean_value_al">27.649999999999999</element>
            <element tag="771b,1044" vr="FD" vm="1" len="8" name="mean_value_snr">272.5</element>
        </item>
        <item card="6" len="486">
            <element tag="771b,0000" vr="UL" vm="1" len="4" name="PrivateGroupLength">474</element>
            <element tag="771b,0010" vr="LO" vm="1" len="6" name="PrivateCreator">99CZM</element>
            <element tag="771b,1008" vr="CS" vm="1" len="2" name="laterality">L</element>
            <element tag="771b,1043" vr="FD" vm="1" len="8" name="mean_value_al">27.0100000000000016</element>
            <element tag="771b,1044" vr="FD" vm="1" len="8" name="mean_value_snr">151.90000000000001</element>
        </item>
    </sequence>
    <sequence tag="771b,1032" vr="SQ" card="2" len="1268" name="keratometer_values_sequence">
        <item card="13" len="626">
            <element tag="771b,0000" vr="UL" vm="1" len="4" name="PrivateGroupLength">614</element>
            <element tag="771b,0010" vr="LO" vm="1" len="6" name="PrivateCreator">99CZM</element>
            <element tag="771b,1008" vr="CS" vm="1" len="2" name="laterality">R</element>
            <element tag="771b,1016" vr="FD" vm="1" len="8" name="refractive_index">1.3374999999999999</element>
            <element tag="771b,1017" vr="FD" vm="1" len="8" name="quali_tag">0</element>
            <element tag="771b,1049" vr="FD" vm="1" len="8" name="mean_value_r1">8.5199999999999996</element>
            <element tag="771b,104a" vr="FD" vm="1" len="8" name="mean_value_d1">39.609999999999999</element>
            <element tag="771b,104b" vr="FD" vm="1" len="8" name="mean_value_a1">174</element>
            <element tag="771b,104c" vr="FD" vm="1" len="8" name="mean_value_r2">8.4499999999999993</element>
            <element tag="771b,104d" vr="FD" vm="1" len="8" name="mean_value_d2">39.939999999999998</element>
            <element tag="771b,104e" vr="FD" vm="1" len="8" name="mean_value_a2">84</element>
            <element tag="771b,104f" vr="FD" vm="1" len="8" name="mean_value_zyl">0.33000000000000003</element>
        </item>
        <item card="13" len="626">
            <element tag="771b,0000" vr="UL" vm="1" len="4" name="PrivateGroupLength">614</element>
            <element tag="771b,0010" vr="LO" vm="1" len="6" name="PrivateCreator">99CZM</element>
            <element tag="771b,1008" vr="CS" vm="1" len="2" name="laterality">L</element>
            <element tag="771b,1016" vr="FD" vm="1" len="8" name="refractive_index">1.3374999999999999</element>
            <element tag="771b,1017" vr="FD" vm="1" len="8" name="quali_tag">0.01</element>
            <element tag="771b,1049" vr="FD" vm="1" len="8" name="mean_value_r1">8.4800000000000004</element>
            <element tag="771b,104a" vr="FD" vm="1" len="8" name="mean_value_d1">39.799999999999997</element>
            <element tag="771b,104b" vr="FD" vm="1" len="8" name="mean_value_a1">167</element>
            <element tag="771b,104c" vr="FD" vm="1" len="8" name="mean_value_r2">8.3399999999999999</element>
            <element tag="771b,104d" vr="FD" vm="1" len="8" name="mean_value_d2">40.469999999999999</element>
            <element tag="771b,104e" vr="FD" vm="1" len="8" name="mean_value_a2">77</element>
            <element tag="771b,104f" vr="FD" vm="1" len="8" name="mean_value_zyl">0.67000000000000002</element>
        </item>
    </sequence>

还有其他 4 个“序列”元素需要解析。

对于每个“序列”元素,我需要提取以下值: 回复

根据值(如果是 R 或 L),我需要将特定值保存两次,一次用于左侧(“L”),一次用于右侧(“R”) 例如: tag="771b,1044" 的正确值是: “272.5” 左边将是: “151.90000000000001”

我疯了!!!!谁能帮我? 如果我搜索特定标签,我可以获得单个值,但我找不到如何首先搜索“R”,然后只搜索与“R”关联的值,然后重复搜索“L”并获取关联值! !!考虑到“R”并不总是第一个元素(它也可能是“L”)。 任何帮助将不胜感激。提前谢谢大家!!

【问题讨论】:

  • 我尝试使用 DOM 搜索特定元素,我可以获得一个特定标签,但在我的情况下,标签不是唯一的。 “横向性”对于每个“物品卡”存在两次,并且
  • 我的回答是否解决了问题?如果是这样,请考虑接受它作为答案,否则请发表后续评论。

标签: java xml parsing search


【解决方案1】:

使用 JSOUP:https://jsoup.org/

我将你的 xml 复制到一个文件 test.xml 并用 JSOUP 解析它:

final Document doc = Jsoup.parse(new File(".\\test.xml"), "UTF-8");

String tag;
BigDecimal left=new BigDecimal(0);
BigDecimal right=new BigDecimal(0);

for (Element sequence : doc.select("sequence")) {
    tag = sequence.attr("tag");

    for (Element item : sequence.select("element[name='laterality']")) {

        String value="";

        if(tag.equals("771b,1030")) value = item.siblingElements().select("element[name='mean_value_snr']").text();
        //specify correct name for other sequences here

        if(!value.isEmpty()){
            if(item.text().equals("L")) left = new BigDecimal(value);
            if(item.text().equals("R")) right = new BigDecimal(value);
        }else{
            left=new BigDecimal(0);
            right=new BigDecimal(0);
        }
    }

    System.out.println(tag + ": " + "L mean_value=" + left + " | R mean_value=" + right);
}

打印出来:

771b,1030: L mean_value=151.90000000000001 | R mean_value=272.5
771b,1032: L mean_value=0 | R mean_value=0

更新:将 double 替换为 BigDecimal 以避免丢失精度

【讨论】:

  • 你是最棒的!非常感谢您提供此解决方案!它完美地工作!我开始失去希望(和我的想法!),而你让它变得如此简单!再次感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-17
  • 1970-01-01
  • 1970-01-01
  • 2016-02-16
  • 1970-01-01
相关资源
最近更新 更多