0

我有许多复杂的 XML 文件,我想查询和搜索以获得一个值,下面是两个缩短的示例:

1

<textInfo>
 <freeText>
  <informationType>15</informationType>
 </freeText>
</textInfo>
<textInfo>
 <freeText>
  <textSubject>4</textSubject>
  <informationType>47</informationType>
 </freeText>
  <freeText>My required text</freeText>
</textInfo>
<textInfo>
 <freeText>
  <informationType>733</informationType>
  <status>1</status>
 </freeText>
</textInfo>

2

<textInfo>
  <freeText>
    <textSubject>4</textSubject>
    <informationType>15</informationType>
    <status>0</status>
  </freeText>
</textInfo>
<textInfo>
  <freeText>
    <textSubject>4</textSubject>
    <informationType>47</informationType>
  </freeText>
  <freeText>My required text</freeText>
</textInfo>
<textInfo>
  <freeText>
    <textSubject>4</textSubject>
    <status>0</status>
  </freeText>
</textInfo>
<textInfo>
  <freeText>
    <textSubject>4</textSubject>
    <informationType>61</informationType>
  </freeText>
</textInfo>
<textInfo>
  <freeText>
    <textSubject>4</textSubject>
    <informationType>39</informationType>
  </freeText>
  <freeText>some text</freeText>
  <freeText>some other text</freeText>
</textInfo>

所需的输出是:标签内的文本<freeText>(我需要的文本) where tag <informationType>= (47)

尝试了多个 linq to xml 代码,但没有一个对我有用。前任。

代码1

var query = from q in XDocument.Parse(requestInterceptor.LastResponseXML)
    .Descendants("freeText")
    where (bool)q.Element("informationType").Equals("47")
    select q.Element("freeText").Value;

代码2

XDocument doc = XDocument.Parse(requestInterceptor.LastResponseXML); ;
    var q = doc
    .Descendants("freeText[1]")
    .Where(ft => ((int?)ft.Element("informationType")) == 47);
Object.Type = q.ToString();

代码3

XmlDocument doc = new XmlDocument();
                    doc.LoadXml(requestInterceptor.LastResponseXML);

                    foreach (XmlNode node in doc.DocumentElement.SelectSingleNode("//textInfo/freeText[informationType>=47]/informationType"))
                    {
                        Object.Type = node.InnerText;
                    }

代码4

XmlDocument doc2 = new XmlDocument();
                    doc.LoadXml(requestInterceptor.LastResponseXML);
                    foreach (XmlNode node in doc2.SelectNodes("//textInfo/freeText[informationType>=47]/informationType"))
                    {
                        Object.Type = node.InnerText;
                    }

注意:我只从 web 服务获取 xml。我没有将它存储在某处或将其作为 xml 文件。另请注意,这是 xml 的一部分,只有我需要获取信息

4

2 回答 2

2

您需要获取所选元素的兄弟freeText元素。您可以将 XPATH 查询与适当的命名空间一起使用:

var doc = new XmlDocument(); doc.LoadXml(XMLfile); 
var xmlns = new XmlNamespaceManager(doc.NameTable); 
xmlns.AddNamespace("ns", "your_namespace"); 
var res = doc.SelectSingleNode("//ns:textInfo/ns:freeText[ns:informationType='47']/following-sibling::ns:freeText", xmlns);     
Console.Write(res.InnerText);

输出:

我需要的文字

更新(根据评论中的要求):

同级节点是紧跟在同一树级别中的选定节点之后的节点。

第二个例子:

<textInfo>
  <freeText>
    <textSubject>4</textSubject>
    <informationType>47</informationType>
  </freeText>
  <freeText>My required text</freeText>
</textInfo>

上面的代码正在执行以下操作:

  1. 选择freeTextinformationType 等于 47 的第一个节点。
  2. 选择 freeText 的第一个兄弟节点,是带有“My required text”的自由自由文本
于 2019-11-25T11:36:48.893 回答
0

您可以尝试以下操作(我只是假设您有根元素,否则它对您不起作用。

在这里检查小提琴

    string input = @"<root>
        <textInfo>
            <freeText>
                <informationType>15</informationType>
            </freeText>
        </textInfo>
        <textInfo>
            <freeText>
                <textSubject>4</textSubject>
                <informationType>47</informationType>
            </freeText>
            <freeText>My required text</freeText>
        </textInfo>
        <textInfo>
            <freeText>
                <informationType>733</informationType>
                <status>1</status>
            </freeText>
        </textInfo>
    </root>";

    var doc = XDocument.Parse(input);


    var freeTexts = doc.Descendants("textInfo")
        .Where(tf => tf.Element("freeText").Element("informationType") != null &&
               tf.Element("freeText").Element("informationType").Value.Equals("47") &&
               tf.Elements("freeText").Count() > 1)
        .Select(tf => tf.Elements("freeText").Skip(1).Single().Value).ToList();
于 2019-11-25T13:10:27.890 回答