1

次のような XML ファイルがあります。

<Companies type="Container">
<Company type="Category">
    <Name type="Property">Company 123</Name>
    <Location type="Property">New York</Location>
    <Employees type="Container">
        <Employee type="Reference">
            <Name type="Property">John Smith</Name>
            <Email type="Property">john@company.123</Email>
        </Employee>
        <Employee type="Reference">
            <Name type="Property">Jane Doe</Name>
            <Email type="Property">jane@company.123</Email>
        </Employee>
</Company>
<Company type="Category">
    <Name type="Property">Company ABC</Name>
    <Location type="Property">Minneapolis</Location>
    <Employees type="Container">
        <Employee type="Reference">
            <Name type="Property">John Doe</Name>
            <Email type="Property">doe@company.abc</Email>
        </Employee>
        <Employee type="Reference">
            <Name type="Property">Jane Smith</Name>
            <Email type="Property">smith@company.abc</Email>
        </Employee>
</Company>

このファイルを調べて、すべての情報を取得して、作業できるようにする必要があります。Nokogiri を使用して、各「会社」をループしてアクセスし、「名前」と「場所」のプロパティを問題なく取得できます。しかし、どうすればよいかわかりません。それは、各「会社」の「従業員」情報にアクセスすることです。

私は単純なものを見逃していると確信していますが、私は詮索好きなところを掘り下げてきましたが、これを分かりやすく説明することはできません。助けていただければ幸いです。

4

2 に答える 2

8

注:(raw_xml_string, nil, nil, Nokogiri::XML::ParseOptions::STRICT)開発時に引数を渡して、不正な形式の xml をキャッチすることを強くお勧めします。

xdoc = Nokogiri.XML(raw_xml_string)

( xdoc/'/Companies/Company' ).each {|com|
  puts "company:"
  p [(com/'./Name').text, (com/'./Location').text]

  puts "employees:"
  # you need another loop to grab the employees.
  (com/'Employees/Employee').each {|emp|
    p [(emp/'./Name').text, (emp/'./Email').text]
  }
}

/またはメソッドを使用する際に注意すべき点%は、直接の子だけでなく、すべての子孫が選択されることです。'./Name'の代わりに使用したのはそのため'Name'です。

于 2012-07-12T18:17:32.300 に答える
2

XMLの形式が正しくありません。

errors()Nokogiriは、問題がメソッドを使用している場所を見つけるのに役立ちます。XMLの解析とチェックerrors()

doc = Nokogiri::XML(xml)
puts doc.errors

出力:

Unescaped '<' not allowed in attributes values
attributes construct error
Couldn't find end of Start Tag Name line 4
Opening and ending tag mismatch: Company line 3 and Name
Opening and ending tag mismatch: Employees line 6 and Company
Unescaped '<' not allowed in attributes values
attributes construct error
Couldn't find end of Start Tag Name line 17
Opening and ending tag mismatch: Company line 16 and Name
Opening and ending tag mismatch: Employees line 19 and Company

NokogiriはXMLを修正しようとしますが、正しく実行できないことがいくつかあります。欠落している引用符を修正することは、それらの1つです。

<Name type="Property>Company 123</Name>
<Name type="Property>Company ABC</Name>

間違っている。彼らはする必要があります:

<Name type="Property">Company 123</Name>
<Name type="Property">Company ABC</Name>

また、どちらの場合もの終了タグが</Employees>ありませんが、のこぎりが修正します。

于 2012-07-12T19:21:58.207 に答える