2014-10-03 42 views
0

任務:讀取XML文件以創建模板;基於密鑰中某些字符串的一部分從HashMap中檢索密鑰?

我正在閱讀這個XML文件,如下所述,並將其放入HashMap中。得到一個鍵值對, 其中Key是元素屬性「name」下的值,Value是元素值。 如:關鍵:map.abc.color.PRIMARY和值:#FFFFFF 如:關鍵:map.abc.node.TEXT1和值:數值

<properties> 
    <property name="map.abc.color.PRIMARY">#FFFFFF</property> 
    <property name="map.abc.color.SECONDARY">#F0F0F0</property> 
    <property name="map.abc.node.TEXT1">value1</property> 
    <property name="map.abc.node.TEXT2">value2</property> 
    <property name="map.abc.node.lowercase">value3</property> 
    <property name="map.abc.strFile">/path/to/file</property> 

    <property name="map.pqr.color.PRIMARY">#000000</property> 
    <property name="map.pqr.color.SECONDARY">#ABABAB</property> 
    <property name="map.pqr.node.WORD1">value4</property> 
    <property name="map.pqr.node.WORD2">value5</property> 
    <property name="map.abc.node.lowercase">value6</property> 
    <property name="map.pqr.strFile">/path/to/file</property> 
</properties> 

下面是一個模板(使用一個StringBuffer)輸出寫入文件。

abc = { 
    color: {PRIMARY_COLOR:"#FFFFFF",SECONDARY_COLOR:"#F0F0F0"} 
    node:{TEXT1:"value1",TEXT2:"value2"} 
}; 

pqr = { 
    color: {PRIMARY_COLOR:"#FFFFFF",SECONDARY_COLOR:"#F0F0F0"} 
    node:{WORD1:"value4",WORD2:"value5"} 
}; 

Offnote:我正在使用以下模式,它工作正常。

key.matches("map.abc.*.*\\p{Lu}$") or key.matches("map.*.*\\p{Lu}$") 

我因此希望找到一種方式來獲得所有的鍵從HashMap的關鍵中的最後一個句號之後大寫字母(或者可能是任何其他選項)結束

+0

你必須遍歷整組鍵,並檢查(用正則表達式或簡單地拆分字符串)哪些最後一部分大寫。 – 2014-10-03 01:46:19

+0

您正在使用錯誤的數據結構作業。數據庫可以很容易地做到這一點。否則你需要一張輔助地圖。 – EJP 2014-10-03 01:47:13

回答

1

可以匹配的關鍵下面的正則表達式,看看它是否返回true:

key.matches(".*\\.[A-Z]+"); 
+0

只有密鑰以大寫字母結束,thiw纔有效。他的發言說明了關鍵的任何部分。儘管示例只顯示大寫結尾 – 75inchpianist 2014-10-03 01:48:03

+0

另一方面,OP的最後一行說明了這一點。我想,當他說最後一個元素時,他意味着他的「分離」字符串的最後一部分。 – 2014-10-03 02:02:26

+0

只是爲了清除,如果關鍵是「map.abc.color。SECONDARY「,那麼我需要在最後一段時間後以大寫字母結尾的密鑰。我正在使用以下模式來檢索它,並且正在工作:key.matches(」map.abc。*。* \\ p {Lu} $「 )或可能是key.matches(「map。*。* \\ p {Lu} $」) – Cozmonaut 2014-10-04 00:43:49

1

OK,現在我們有更多的細節,我們可以解決你的數據結構。在我看來,你在這裏有一個分層的地圖。您的name似乎定義了層次結構。我會使用地圖的地圖存儲它:

Map<String, Map<String, Map<String, String>>> structure = new HashMap<>(); 

解析和填充圖(完全只是僞代碼):

path = name.split(".") 
// ignore path[0] since it's just 'map' 
structure.get(path[1]).get(path[2]).put(path[3], value) 

,並檢索值

for (Map<String, Map<String, String>> element : structure){ 
    for(Map<String, String> group : element) { 
    for(String attribute : group.keys){ 
     if(allUpper(attribute)) { //DO YOUR THING HERE } 
    } 
    } 
} 
0

它在我看來,你正試圖從一個Java屬性風格的值列表轉換爲JavaScript對象。

以下是一種可能性:您可以將屬性樣式Map「unflatten」爲遞歸的maps/values映射,然後利用其中一個JSON庫輸出值。下面是一些代碼來解開事情:

public class Foo { 
    private static final String ROOT_NAME = "map"; 

    private static boolean noLowercase(CharSequence s) { 
    return !s.chars().anyMatch(Character::isLowerCase); 
    } 

    private static Map<String, Object> getNextMap(Map<String, Object> map, String mapName) { 
    Object nextObj = map.get(mapName); 
    if (nextObj == null) { 
     nextObj = new LinkedHashMap<String, Object>(); 
     map.put(mapName, nextObj); 
    } 
    @SuppressWarnings("unchecked") 
    Map<String, Object> nextMap = (Map<String, Object>)nextObj; 
    return nextMap; 
    } 

    public static Map<String, Object> unflatten(Map<String, String> properties) { 
    List<String> sortedKeys = new ArrayList<>(properties.keySet()); 
    Collections.sort(sortedKeys); 
    Map<String, Object> rootObject = new LinkedHashMap<>(); 
    for (String key : sortedKeys) { 
     String[] splitKey = key.split("\\."); 
     String lastItem = splitKey[splitKey.length - 1]; 
     if (noLowercase(lastItem)) { 
     Map<String, Object> currentMap = rootObject; 
     for (int i = 1; i < splitKey.length - 1; ++i) { 
      currentMap = getNextMap(currentMap, splitKey[i]); 
     } 
     currentMap.put(lastItem, properties.get(key)); 
     } 
    } 
    return rootObject; 
    } 
} 

在這之後,與Gson或Jackson的序列化應該相當容易。下面是使用GSON一個例子:

public static void printMap(Map<String, String> map) { 
    Gson gson = new GsonBuilder().setPrettyPrinting().create(); 

    for (Map.Entry<String, Object> entry : unflatten(map).entrySet()) { 
     System.out.format("%s = ", entry.getKey()); 
     System.out.print(gson.toJson(entry.getValue())); 
     System.out.println(";"); 
     System.out.println(); 
    } 
    } 

另外,它不應該太難寫自己的打印程序的地圖數據結構的地圖。