2012-08-23 30 views
0

我想要一種改變YAMJ的xml文件中觀看電影狀態的方式。我可以提供baseFilenameBase,fileLocation和fileURL。我想將兩個觀看的eleiments改爲true。使用python替換xml文件中的兄弟姐妹

<library count="1"> 
    <category count="1" current="true" name="Other"> 
     <index </index> 
    </category> 
    <movies cols="18" count="18" indexCount="673" totalCount="737"> 
     <movie isExtra="false" isSet="false" isTV="false"> 
     <baseFilenameBase>FILE NAME</baseFilenameBase> 
     <watched>false</watched> 
     <files> 
      <file firstPart="1" lastPart="1" season="-1" size="0" subtitlesExchange="NO" 
        title="UNKNOWN" 
        watched="false" 
        zcd="2"> 
       <fileLocation>PATH TO FILE</fileLocation> 
       <fileURL>PATH TO FILE</fileURL> 
      </file> 
     </files> 
     </movie> 
     <movie 

     And repeats ..... 
    </movies> 
</library>  

我設法在其他的XML文件替換觀看DY做

   doc = parse(file) 
       node = doc.getElementsByTagName('watched') 
       node[0].firstChild.nodeValue = 'true'  

相比試圖去與兄弟姐妹/近鄰交手

回答

0

下面我們來設置看着那是很簡單的在所有電影和文件中都是如此,您應該調整它以僅更改所需的內容,並將movies.xml更改爲文件的名稱。

from xml.etree import ElementTree 

tree = ElementTree.parse('movies.xml') 

for movie in tree.findall('movies/movie'): 
    movie.find('watched').text = 'true' 
    for mfile in movie.findall('files/file'): 
     mfile.set('watched', 'true') 

tree.write('movies.xml') 
+0

謝謝,這確實改變了所有的真實,set命令很好找。我嘗試只替換通過添加如果unicode(movie.find('baseFilenamebase').text)== myMedia.oStatus.fileName [: - 4]添加所需的觀看文件:在樹中的第一個電影之後,但這樣做不工作:(我已經試過這個,但沒有工作。 – jhmiller

+0

樹= ElementTree.parse(名稱)電影樹 \t \t \t \t \t \t一些變化。的findall( '電影/電影'): \t \t \t \t \t \t \t penContents = movie.getchildren() \t \t \t \t \t \t \t內容在penContents: \t \t \t \t \t \t \t \t如果content.text == myMedia.oStatus.fileName [: - 4]: \t \t \t \t。\t \t \t \t movie.find( '觀看')文本= '真' \t \t \t \t \t \t \t \t \t在movie.findall M文件( '文件/文件'): \t \t \t \t \t \t \t \t \t \t mfile.set( '觀看', '真') \t \t \t \t \t \t \t \t \t \t bak_name =名[: - 4] + 'BAK' \t \t \t \t \t \t \t \t \t \t tree.write(bak_name) \t \t \t \t \t \t \t \t \t \t os.rename (bak_name,名稱) – jhmiller

0
   msg = 'Starting xml update in '.format(updatexmlwatched) 
      Debug(msg) 
      pchtrakt.logger.info(msg) 
      if pchtrakt.isMovie: 
       xmlpath = updatexmlwatched + "Other*.xml" 
       for name in glob.glob(xmlpath): 
        if myMedia.oStatus.fileName[:-4] in open(name).read():#gets xml file name as name 
         tree = ElementTree.parse(name) 
         for movie in tree.findall('movies/movie'): 
          if movie.find('baseFilenameBase').text == myMedia.oStatus.fileName[:-4]:#for content in penContents: 
           movie.find('watched').text = 'true' 
           for mfile in movie.findall('files/file'): 
            mfile.set('watched', 'true') 
            bak_name = name[:-4]+'.bak' 
            tree.write(bak_name) 
            os.rename(bak_name, name) 
            txt = name.replace(updatexmlwatched, '') + ' has been modified as watched for ' + myMedia.oStatus.fileName 
            Debug(txt) 
            pchtrakt.logger.info(txt) 
            break 
      elif pchtrakt.isTvShow: 
       a = re.split("([-|.]*[Ss]\\d\\d[Ee]\\d\\d.)", myMedia.oStatus.fileName) 
       ep_name = a[2][:-4].replace(".", " ").replace("- ", "") 
       season_xml = a[0][:-3].replace(".", " ").replace(" - ", "") 
       f_size = str(os.path.getsize(myMedia.oStatus.fullPath)) 
       ep_no = '01' 
       fileinfo = updatexmlwatched + "Set_" + season_xml + "*.xml" 
       for name in glob.glob(fileinfo): 
        if myMedia.oStatus.fileName in open(name).read(): 
         tree = ElementTree.parse(name) 
         for movie in tree.findall('*/movie/files/file'): 
          if movie.get('firstPart') == str(myMedia.parsedInfo.episode_numbers[myMedia.idxEpisode]) and movie.get('season') == str(myMedia.parsedInfo.season_number): 
           movie.set('watched', 'true') 
           bak_name = name[:-4]+'.bak' 
           tree.write(bak_name) 
           os.rename(bak_name, name) 
           txt = name.replace(updatexmlwatched, '') + ' has been modified as watched for ' + myMedia.oStatus.fileName 
           Debug(txt) 
           pchtrakt.logger.info(txt) 
           break 
       fileinfo = updatexmlwatched + "Other*.xml" 
       for name in glob.glob(fileinfo): 
        if myMedia.oStatus.fileName in open(name).read(): 
         tree = ElementTree.parse(name) 
         for movie in tree.findall('*/movie/files/file'): 
          if movie.get('size') == f_size and movie.get('firstPart') == str(myMedia.parsedInfo.episode_numbers[myMedia.idxEpisode]) and movie.get('season') == str(myMedia.parsedInfo.season_number): 
           movie.set('watched', 'true') 
           bak_name = name[:-4]+'.bak' 
           tree.write(bak_name) 
           os.rename(bak_name, name) 
           txt = name.replace(updatexmlwatched, '') + ' has been modified as watched for ' + myMedia.oStatus.fileName 
           Debug(txt) 
           pchtrakt.logger.info(txt) 
           break 

這是我已經結束了。它確實有效,但如果xml位於網絡共享上,有時會導致媒體播放口吃。我相信它正在發生,而它正在搜索包含該變量的XML。作爲低功耗媒體播放器的運行方式,是否存在系統飢餓的方式?

感謝

0

也許蟒蛇是不是如果你是一個小媒體服務器上運行它應該有它sed答案。

sed -i 's/<watched>false/<watched>true/g' movies.xml 

只是檢查你有其中sed版本sed -h所以你知道什麼可供選擇。

0

假設你的baseFilenameBase是唯一的,一個簡單的方法來做到這一點如下:我不能評論,所以我不能添加這個sp的答案。

神奇的是XPath表達式 「//電影[baseFilenameBase /文本()= 'PATHHERE']」 這是XPath表達式,說:

  • //電影 - 找到所有的電影節點
  • [條件] - 當條件爲真
  • baseFilenameBase /文本()= 'PATHHERE' - 甲條件說,它必須有一個baseFilenameBase節點,包含文本 'PATHHERE'

我然後使用格式來將路徑變量的內容放入。 XPath是引用xml節點的絕妙語法,check here for more infomation

p.s.我必須承認我沒有這樣做。但我不認爲有任何語法錯誤,它應該工作。

from xml.etree import ElementTree 

tree = ElementTree.parse('movies.xml') 
movie = tree.find("//movie[baseFilenameBase/text() = '{}']".format(path)) 
movie.find('watched').text = 'true' 
for file in movie.find('files').findall('file') 
    file.set("watched", 'true') 

tree.write('movies.xml')