2016-02-11 19 views
1

比方說,我有這兩個簡單的XML文件:XML文檔的語義等價

例1

<parent name="Bob" gender="male"> 
    <child name="Steve" gender="male"></child> 
    <child name="Stephanie" gender="female"></child> 
</parent> 

例2

<parent name="Bob" gender="male"> 
    <child name="Stephanie" gender="female"></child> 

    <child name="Steve" gender="male"></child> 

</parent> 

我想創建一個函數,它將輸入兩個表示XML的字符串,並且當且僅當它們在語義上相等時返回true ENT。在這種情況下,儘管存在空白區別並且子節點順序不同,但XML文件在語義上仍然是相同的。

我現在有一個看似工作的解決方案,但我擔心它可能有缺陷或者我可能已經overthought問題。我目前的解決方案涉及三個步驟

  1. 取下字符串的所有空格
  2. 排序的字母數字字符串
  3. 執行標準字符串平等檢查

該解決方案似乎工作,但我不知道是否有任何問題或者我應該以另一種方式解決這個問題。

+1

爲什麼不解析使用任何可用庫和檢查提取的值的XML? – SJuan76

+0

@ SJuan76請給我更多的背景。 – Ogen

回答

2

XML沒有內在的語義。語義一般是指意義,並作爲一種數據格式,XML本身並不關心意義。

你真正似乎追求的是兩個XML文檔的等價形式。爲了能夠應用排序的「標準字符串平等檢查」你提到,考慮將XML轉換成標準詞彙的形式,如通過以下建議一個定義:

最後,你可能會考慮這兩個文件是在相當於一個語法,而不是如果證件都是有效的根據定義等價一個詞彙層面是真實的相同的XML模式。

+0

我不認爲標準化會對元素進行排序。例如,兩個孩子的標籤steve和stephanie,他們的順序不重要。我只是嘗試規範化,但沒有奏效。 – Ogen

+0

默認情況下元素順序在XML中很重要。也許你更喜歡在語法層次上指定等價關係,而不是通過'xsd:all'來指示順序無差異。 – kjhughes

+0

遵守相同的模式不能證明語法等價。離得很遠。 – raulk

1

什麼是在XML顯著的東西,只有你自己才能決定。史蒂夫和史蒂芬可能會或可能不是同一個名字。最好不要使用「語義」這個詞:只需定義你的等價規則。測試等價性的一般方法是定義一個標準形式,將數據轉換爲標準形式,然後對標準化值進行簡單的詞彙測試 - 這是一個完美的合理方式。但只有你可以決定適當的歸一化函數是什麼。

+0

非常感謝您的幫助。我正在考慮以寬度優先的方式遍歷XML文檔並將所有節點添加到Set。然後我可以檢查兩組的平等。我認爲這將起作用。 – Ogen