0

私は次のXMLを持っています

<Company name="Kinanah Computers">
  <Computer Name="Computer" type="Dell">
      <Accessory type="screen" model="dell"/>
      <Accessory type="mouse" model="dell"/>
      <Accessory type="keyboard" model="dell"/>
  </Computer>
  <Computer Name="Computer" type="HP">
        <Accessory type="screen" model="hp"/>
        <Accessory type="mouse" model="chinese"/>
        <Accessory type="keyboard" model="dell"/>
  </Computer>
  <Computer Name="Computer" type="HP">
        <Accessory type="screen" model="hp"/>
        <Accessory type="mouse" model="chinese"/>
        <Accessory type="keyboard" model="dell"/>
  </Computer>
  <Computer Name="Computer" type="acer">
        <Accessory type="screen" model="acer"/>
        <Accessory type="mouse" model="acer"/>
        <Accessory type="keyboard" model="acer"/>
  </Computer>
</Company>

私がやりたいのは、タイプがHPの場合はHPコンピューターをスキップすることですが、その方法を教えてもらえますか?

私は次のC#コードを使用しています:

var stream = new StringReader(instanceXml/*the xml above*/);
var reader = XmlReader.Create(stream);
var hpCount = 0;
reader.MoveToContent();

while (reader.Read())
{
  if(reader.NodeType == XmlNodeType.Element)
  {
     if(reader.GetAttribute("Name") == "Computer" && reader.GetAttribute("type") == "HP")
     {
        if(hpCount >1)
        {
           reader.Skip();
          continue;
        }
        hpCount++;
     }
  }
}

しかし、スキップは機能していません。読み取られた次の要素は

<Accessory type="screen" model="hp"/>

これらの行をスキップする方法の助けはありますか?ありがとうございました。

4

3 に答える 3

1

Linq を使用して xml を簡単に解析できます。

XDocument xdoc = XDocument.Parse(instanceXml);
var query = from c in xdoc.Descendatns("Computer")
            where (string)c.Attribute("type") != "HP"
            select new {
               Name = (string)c.Attribute("Name"),
               Type = (string)c.Attribute("type"),
               Accessories = from a in c.Elements()
                             select new {
                                Type = (string)a.Attribute("type"),
                                Model = (string)a.Attribute("model")
                             }
            };

これにより、厳密に型指定された匿名オブジェクトのコレクションが得られ、ネストされたアクセサリのコレクションでコンピューター データを表します。

于 2012-11-19T10:32:30.573 に答える
0

hpCount > 1 をチェックする代わりに、hpCount > 0 をチェックします。

if(hpCount >1)
{
  reader.Skip();
  continue;
 }
于 2012-11-19T11:14:14.507 に答える
0

カウントに従ってフィルタリングするので、実際にはこれは役に立ちません。申し訳ありませんが、コードを更新しました。もう一度確認していただけますか?

List<XElement> query = from c in xdoc.Decendants("Computer") // from <Computer> tag or lower
where (string)c.Attribute("type") == "HP" // where <Computer> attribute name is "type" and "type" equals string value "HP"
select c; // return List of matching `<Computer>` XElements

int HpComputers = query.count; // You want to filter by amount of HP computers?

このようにカウントに従ってフィルタリングしますか?

于 2012-11-19T11:06:53.767 に答える