0

処理用に 1 つの Xml ノードがあります。次の 1 つが私の xml ノードです。

<w:p>
 <w:r>
   <w:t>
     Text1
   </w:t>
  </w:r>
  <w:r>
    <w:pict>
       <w:p>
         <w:r>
           <w:t>
             text2
            </w:t>
          </w:r>
        </w:p>
      </w:pict>
   </w:r>
 <w:r>
   <w:t>
     Text3
   </w:t>
  </w:r>
  <w:r>
</w:p>

<w:p><w:r><w:t>ここで、からではなく、のみから内部テキストを取得したいと考えてい<w:p><w:r><w:pict><w:p><w:r><w:t>ます。

だから、私の必要な出力はText1Text3

私のC#コードは次のとおりです。

 XmlNodeList pNode = xDoc.GetElementsByTagName("w:p");
 for (int i = 0; i < pNode.Count; i++)
 {
    if(i==0)  //This is my criteria 
    {
      XmlNode firstNode = pNode[i];
      string innerText=firstNode.innerText.toString().Trim();
    }
 }

しかし、それはすべての内部テキストを返しますText1Text2Text3

この問題から抜け出す方法を教えてください。

4

3 に答える 3

1

あなたはXPathを使うことができます:(私は以下があなたのために働くはずだと思います)

w:p/w:r/w:t
于 2012-09-27T06:38:18.427 に答える
0

p各要素について、そのアンカーのいずれも要素ではないことを確認する必要がありpictます。

var result = XElement.Load(@"path-to-your-xml")
                     .Descendants("t")
                     .Where(e => !e.AnchestorsAndSelf().Any(a => a.Name.LocalName == "pict"));
于 2012-09-27T06:44:39.033 に答える
0

を使用することをお勧めしますXDocument(.NET 3.5 以降を使用している場合)。このコードは、 pattern を持つp/r/tが を持たないすべての要素の値を取得しpict/p/r/tます。

        // Use this if you're loading XML from a string
        XDocument doc = XDocument.Parse(inputString);
        // Use this if you're loading XML from a file
        //XDocument doc = XDocument.Load(<filepath>);

        var pElements = doc.Root
            .Descendants()
            .Where(el => el.Name.LocalName == "p" && el.Parent.Name.LocalName != "pict");

        List<string> innerTexts = new List<string>();
        foreach(XElement p in pElements)
        {
            var rElements =  p.Elements().Where(el => el.Name.LocalName == "r");
            foreach(XElement r in rElements)
            {
                var tElements = r.Elements().Where(el => el.Name.LocalName == "t");
                innerTexts.AddRange(tElements.Select(el => el.Value).ToArray());
            }
        }

名前空間LocalNameに関する情報が提供されていなかったので使用しました。w

于 2012-09-27T07:16:53.843 に答える